第10章 数组和指针

int arry[]={[5]=5};//arry[5]初始化为5

未初始化大小时,编译器会把大小设置为足够装下所有初始化值的大小

数组名是该数组首个元素的地址

ar[1]和*(ar+1)这两个表达式是等价的,无论ar是数组名还是指针变量。但只有当ar是指针变量才能使用ar++这样的表达式

指针与整数相加:

整数和指针所指类型的大小(以字节为单位)相乘,然后将结果与初始地址相加

依次 ar+4 与&ar[4]等价。

解引用: *运算符给出指针指向地址上存储的值。

千万不要解引用未初始化的指针,如:

int * pt;//未初始化

*pt=5;//严重错误

创建一个指针时,系统只分配了存储指针本身的内存,并未分配存储数据的内存。

指针赋值和const

把const数据或非const数据的地址初始化为指向const的指针或为其赋值是合法的;

但是只能把非const数据的地址赋值给普通指针。

指针与多位数组:
    int a[4][2];
    printf("%p\n", a);
    printf("%p\n",a[0] );
    printf("%p\n", a+1);
    printf("%p\n",a[0]+1);

依次打印:

0x7ffdda757e50
0x7ffdda757e50
0x7ffdda757e58
0x7ffdda757e54

可以发现a与a[0]输出相同,都为二维数组a的首地址.

但是都是加1,输出却不同,原因在于a指向的对象占用了两个int的大小,因此地址+8个字节;而a[0]指向的对象只占用了1个int的大小,因此地址+4个字节。


    printf("%p\n",*(a+2)+1);

    printf("%p\n",&a[2][1]);

输出结果相同,也表明a[2][1]等价于*(*(a+2)+1)

猜你喜欢

转载自blog.csdn.net/qq_28449863/article/details/80666951