深入理解C语言指针——挑战C指针笔试题(9)

51 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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. 除此之外所有的数组名都表示首元素的地址。