C基础第29课--指针和数组分析(下)

学习自狄泰软件学院唐佐林老师C语言课程,文章中图片取自老师的PPT,仅用于个人笔记。


在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

实验1 :数组的访问方式

#include <stdio.h>

int main()
{
    int a[5] = {0};
    int* p = a;
    int i = 0;
    
    for(i=0; i<5; i++)
    {
        p[i] = i + 1;
    }
    
    for(i=0; i<5; i++)
    {
        printf("a[%d] = %d\n", i, *(a + i));
    }
    
    printf("\n");
    
    for(i=0; i<5; i++)
    {
        i[a] = i + 10;
    }
    
    for(i=0; i<5; i++)
    {
        printf("p[%d] = %d\n", i, p[i]);
    }
    
    return 0;
}



mhr@ubuntu:~/work/C$ gcc 29-1.c
mhr@ubuntu:~/work/C$ 
mhr@ubuntu:~/work/C$ ./a.out 
a[0] = 1
a[1] = 2
a[2] = 3
a[3] = 4
a[4] = 5

p[0] = 10
p[1] = 11
p[2] = 12
p[3] = 13
p[4] = 14
mhr@ubuntu:~/work/C$ 

实验2 :数组与指针的不同

ext.c

int a[] = {1, 2, 3, 4, 5};

29-2.c

#include <stdio.h>

int main()
{
    extern int a[];
    
    printf("&a = %p\n", &a);
    printf("a = %p\n", a);
    printf("*a = %d\n", *a);

    
    return 0;
}


mhr@ubuntu:~/work/C$ 
mhr@ubuntu:~/work/C$ gcc ext.c 29-2.c
mhr@ubuntu:~/work/C$ 
mhr@ubuntu:~/work/C$ ./a.out 
&a = 0x601040
a = 0x601040
*a = 1
mhr@ubuntu:~/work/C$ 

#include <stdio.h>

int main()
{
    extern int* a;
    
    printf("&a = %p\n", &a);
    printf("a = %p\n", a);//s 是指针 指针是变量 指针变量里面保存的是地址值,一个地址值占用4个字节(或八个字节),此时数据数据产生截断。
    printf("*a = %d\n", *a);//此时a 是指针,保存着数组第一个元素的地址,即此时0x1被当做了地址,去取0x1地址中的数据,不能访问改地址。

    
    return 0;
}


mhr@ubuntu:~/work/C$ gcc ext.c 29-2.c
mhr@ubuntu:~/work/C$ 
mhr@ubuntu:~/work/C$ ./a.out 
&a = 0x601040
a = 0x200000001//
Segmentation fault (core dumped)
mhr@ubuntu:~/work/C$ 

定义数组的时候,编译器直接将标识符a 映射到数组的首地址上面,在内存中 是没有变量名 标识符的,程序经过编译之后 所有的标识符和变量名都变成了对应的地址。

在这里插入图片描述

实验3 :指针运算问题

#include <stdio.h>

int main()
{
    int a[5] = {1, 2, 3, 4, 5};
    int* p1 = (int*)(&a + 1); 
    int* p2 = (int*)((int)a + 1);
    int* p3 = (int*)(a + 1);
    
    printf("%d, %d, %d\n", p1[-1], p2[0], p3[1]);
    
    return 0;
}

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

发布了192 篇原创文章 · 获赞 100 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/LinuxArmbiggod/article/details/104059697