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个字节。
未初始化大小时,编译器会把大小设置为足够装下所有初始化值的大小
数组名是该数组首个元素的地址
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)