关于指针和数组的运算

首先我们要知道:

sizeof(数组名),这里的数组名表示整个数组

&数组名,这里的数组名表示整个数组

下来我们看看一堆练习吧

一、

printf("%d\n", sizeof(a));    //16   整个数组大小
	printf("%d\n", sizeof(a + 0));  //4 首元素的地址
	printf("%d\n", sizeof(*a));   //4  第一个元素的大小
	printf("%d\n", sizeof(a + 1));  // 4 第二个元素的地址
	printf("%d\n", sizeof(a[1]));   //4  第二个元素
	printf("%d\n", sizeof(&a));    // 4  整个数组的地址,数值上和首元素地址相同
	printf("%d\n", sizeof(&a + 1));// 4    下一个数组的地址
	printf("%d\n", sizeof(&a[0]));   //4 首元素地址
	printf("%d\n", sizeof(&a[0] + 1));//4   第二个元素的地址
	printf("%d\n", sizeof(*&a));   //16  整个数组  
	system("pause");
	return 0;

二、字符数组

char a[] = { 'a', 'b', 'c', 'd', 'e', 'f' };  
	printf("%d ", sizeof(a));       //6  整个数组大小
	printf("%d ", sizeof(a + 0));  //4 首元素的地址   =&a[0]
	printf("%d ", sizeof(a[1]));   //1  第二个元素
	printf("%d ", sizeof(&a));    // 4  整个数组的地址,数值上和首元素地址相同
	printf("%d ", sizeof(&a + 1));// 4    下一个同类型数组的地址
	printf("%d ", sizeof(&a[0] + 1));//4   第二个元素的地址

printf("%d ", strlen(a));       //>6  一个随机值  假设为10
	printf("%d ", strlen(a + 0));  // 10    
	//printf("%d ", strlen(a[1]));   //出错  strlen是char *   而a[1]是char  类型不匹配
	//printf("%d ", strlen(&a));    // 10   会出现告警,这里是数组指针,但数值一样
	//printf("%d ", strlen(*a));     //出错  类型不匹配 
	printf("%d ", strlen(&a + 1));// 10-6=4     下一个数组的长度
	printf("%d ", strlen(&a[0] + 1));//10-1=9

这里编译的时候,随机值为19

三、

char *a = "abcdef";     // 默认为'\0'结束
	printf("%d ", sizeof(a));       //4  
	printf("%d ", sizeof(a + 1));  //4 
	printf("%d ", sizeof(*a));   //1 
	printf("%d ", sizeof(a[0]));   //1 
	printf("%d ", sizeof(&a));    // 4  
	printf("%d ", sizeof(&a + 1));// 4    
	printf("%d ", sizeof(&a[0] + 1));//4   
printf("%d ", strlen(a));       //6
	printf("%d ", strlen(a + 1));  // 5   
	//printf("%d ", strlen(a[0]));   //出错  char!=char*
	printf("%d ", strlen(&a));    // 随机值
	//printf("%d ", strlen(*a));     //出错  类型不匹配 
	printf("%d ", strlen(&a + 1));// 随机值
	printf("%d ", strlen(&a[0] + 1));//5

四、二维数组

int a[3][4] = { 0 };
	printf("%d ", sizeof(a));         //48
	printf("%d ", sizeof(a[0][0]));  //4 第一个元素(数组)的第一个元素 
	printf("%d ", sizeof(a[0]));     //16  第一个元素,是一维数组
	printf("%d ", sizeof(a[0]+1));   // 4   a[0]第一个元素,也就是数组名+1  就是第一个元素里面的第二个元素的地址。  
	printf("%d ", sizeof(a+1));      // 4  下一个数组(数组)的地址
	printf("%d ", sizeof(*a));       // 16   第一个元素(数组)      
	printf("%d ", sizeof(&a[0] + 1));//4  下一个元素(数组)的地址 
	printf("%d ", sizeof(a[3]));   //16  第四个元素(数组),具有访问权限

猜你喜欢

转载自blog.csdn.net/z_juan1/article/details/80426274