C语言学习笔记_指针和数组
C语言学习笔记_指针和数组
数组中关键符号的含义
int a[10];
a; //a是数组名称,a不能做左值,a做右值表示数组首元素的首地址(&a[0])
a[0]; //a[0]表示数组的首元素,左值表示数组第0个元素对应的内存空间,做右值表示元素的值
&a; //&a为数组的地址,不能做左值,做右值表示数组的首地址
&a[0]; //&a[0]是数组第0个元素的首地址,表示首元素对应的内存空间
为什么数组的地址不能做左值呢,因为数组的地址在编译器分配后就变成了常量,不可更改,所以不能做左值;
指针访问数组
int a[10];
int *p;
p = a; //正确
p = &a; //错误,类型不兼容
int x = a[m]; //数组访问方式
int y = *(p+m); //指针访问方式
从上一节可知,a做右值表示数组首元素首地址,在这里类型为int *,和p的类型兼容;
而&a为数组的地址,类型为 int (*)[10],和p的类型不兼容;
强制类型转换
对于char、int等属于兼容性类型,转换可能出错,也可能不会出错;
float、double属于不兼容类型,转换肯定出错;
sizeof运算符
char str[] = "hello";
char *p = strl
printf("sizeof(p) = %d.\n", sizeof(p)); //4,指针变量的长度固定为4
printf("sizeof(*p) = %d.\n", sizeof(*p)); //1,char类型的长度为1
printf("sizeof(str) = %d.\n", sizeof(str)); //6,数组长度为6,因为还有\0
printf("strlen(p) = %d.\n", strlen(p)); //5,strlen不计算\0
另外,将数组作为参数传入函数的时候,将会传入数组首地址的指针变量,即函数内部无法获取数组的长度