携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第21天,点击查看活动详情
char *p = "abcdef";
//const修饰的字符常量
printf("%d\n", sizeof(p));// 4/8
//p是字符指针,指针大小4/8
printf("%d\n", sizeof(p+1));// 4/8
//p+1字符指针,指针大小4/8
printf("%d\n", sizeof(*p));// 1
//*p得到第一个元素,元素类型为char
printf("%d\n", sizeof(p[0]));// 1
//同上
printf("%d\n", sizeof(&p));// 4/8
//&p为字符指针,指针大小4/8
printf("%d\n", sizeof(&p+1));//4/8
//&p+1为第二个字符地址,字符指针,指针大小4/8
printf("%d\n", sizeof(&p[0]+1));// 4/8
//同上
printf("%d\n", strlen(p));// 随机值
//p指针,所指空间,'\0'位置未知
printf("%d\n", strlen(p+1));// 随机值-1
//p+1第二个字符地址
printf("%d\n", strlen(*p));// 报错
// *p是字符,strlen参数为指针类型
printf("%d\n", strlen(p[0]));// 报错
//同上
printf("%d\n", strlen(&p));// 另一随机值
// &p是二级指针,
printf("%d\n", strlen(&p+1));// 又另一随机值
//&p二级指针 ,&p+1后还是二级指针
printf("%d\n", strlen(&p[0]+1));// 随机值—1
//&p[0]+1第二个字符地址
//二维数组
int a[3][4] = { 0 };
printf("%d\n", sizeof(a));//48
//sizeof数组名.为整个数组
printf("%d\n", sizeof(a[0][0]));//4
//a[0][0]为第一元素
printf("%d\n", sizeof(a[0]));//16
//a[0]得到二维数组第一行 一行有4个元素
printf("%d\n", sizeof(a[0] + 1));//4/8
//a[0]第一行地址,a[0]+1第二行地址
//第二行地址,数组地址,指针大小4/8
printf("%d\n", sizeof(*(a[0] + 1)));//4
//a[0]首元素地址,即第一行第一个元素地址,
//加一得到第二个元素地址,解引用得到第二个元素
printf("%d\n", sizeof(a + 1));//4/8
//a为第一行地址,a+1第二行地址
printf("%d\n", sizeof(*(a + 1)));//16
//a+1第二行地址,解引用后得到第二行
printf("%d\n", sizeof(&a[0] + 1));//4/8
//&a[0]+1第二行地址
printf("%d\n", sizeof(*(&a[0] + 1)));//16
//&a[0]+1第二行地址 解引用得到第二行
printf("%d\n", sizeof(*a));//16
//a第一行地址,解引用后得到第一行
printf("%d\n", sizeof(a[3]));//16
//数组越界,无第四行,但是根据二维数组前面行的大小
//sizeof认为a[3]相同大小
总结:
数组名的意义:
1. sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
2. &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
3. 除此之外所有的数组名都表示首元素的地址。