数组的相关运算

关于数组的运算,需要注意以下几点:

1. sizeof(数组名):数组名表示整个数组

sizeof(数组名)计算的是整个数组的大小,单位是字节

2. &数组名:数组名表示整个数组

&数组名取的是数组的地址,这里的数组名表示整个数组

3. 之外,所有的数组名表示首元素地址

4. 二维数组要看首元素的地址,首先要把二维数组想成一维数组

5. 地址是四个字节

6. strlen的运算遇到'\0'才会结束

一维数组

int a[] = {1,2,3,4};
printf("%d\n", sizeof(a));        //16 注:a表示整个数组
printf("%d\n", sizeof(a+0));      //4 注:a+0表示首元素的地址
printf("%d\n", sizeof(*a));       //4 注:*a表示首元素的地址
printf("%d\n", sizeof(a+1));      //4 注:a+1表示下标为1的元素的地址
printf("%d\n", sizeof(a[1]));     //4 注:a[1]表示下标为1的元素的地址
printf("%d\n", sizeof(&a));       //4 注:&a表示数组的地址
printf("%d\n", sizeof(*&a));      //16 注:*&a表示整个数组
printf("%d\n", sizeof(&a+1));     //4 注:&a+1表示地址(跳过整个数组)
printf("%d\n", sizeof(&a[0]));    //4 注:&a[0]表示首元素地址
printf("%d\n", sizeof(&a[0]+1));  //4 注:&a[0]+1表示第二个元素的地址

字符数组

char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));        //6 注:arr表示整个数组
printf("%d\n", sizeof(arr+0));      //4 注:arr+0表示首元素的地址
printf("%d\n", sizeof(*arr));       //1 注:*arr表示首元素,即a  
printf("%d\n", sizeof(arr[1]));     //1 注:arr[1]表示第二个元素,即b
printf("%d\n", sizeof(&arr));       //4 注:&arr表示数组的地址
printf("%d\n", sizeof(*&arr));      //6 注:*&arr表示整个数组
printf("%d\n", sizeof(&arr+1));     //4 注:&arr+1表示第二个元素的地址
printf("%d\n", sizeof(&arr[0]+1));  //4 注:&arr[0]+1表示第二个元素的地址

//strlen遇到'\0'才会结束
printf("%d\n", strlen(arr));        //随机数 注:arr表示首元素地址,从首元素向后数字符,而数组里面没有'\0',所以不会结束
printf("%d\n", strlen(arr+0));      //随机数 注:arr+0表示首元素地址,从元素'a'向后数字符
printf("%d\n", strlen(*arr));       //error  注:*arr表示a元素,即数字97
printf("%d\n", strlen(arr[1]));     //error  注:arr[1]表示b元素,即数字98
printf("%d\n", strlen(&arr));       //随机数 注:&arr表示数组的地址,从元素'a'向后数字符
printf("%d\n", strlen(&arr+1));     //随机数 注:&arr+1表示从元素'f'向后数字符
printf("%d\n", strlen(&arr[0]+1));  //随机数 注:&arr[0]+1表示从元素'b'向后数字符


char arr[] = "abcdef"; //包含'\0'
printf("%d\n", sizeof(arr));        //7 注:arr表示整个数组,整个数组有7个元素
printf("%d\n", sizeof(arr+0));      //4 注:arr+0表示首元素的地址
printf("%d\n", sizeof(*arr));       //1 注:*arr表示首元素,即'a'    
printf("%d\n", sizeof(arr[1]));     //1 注:arr[1]表示第二个元素,即'b'
printf("%d\n", sizeof(&arr));       //4 注:&arr表示整个数组的地址
printf("%d\n", sizeof(&arr+1));     //4 注:&arr+1表示地址,跳过整个数组,指向'\0'之后
printf("%d\n", sizeof(&arr[0]+1));  //4 注:&arr[0]+1表示元素'b'的地址

printf("%d\n", strlen(arr));        //6 注:arr表示首元素地址,从元素'a'向后数字符,到'\0'结束
printf("%d\n", strlen(arr+0));      //6 注:arr+0表示首元素地址,从元素'a'向后数,到'\0'结束
printf("%d\n", strlen(*arr));       //error 注:*arr表示'a'元素,即数字97
printf("%d\n", strlen(arr[1]));     //error 注:arr[1]表示'b'元素,即数字98
printf("%d\n", strlen(&arr));       //6 注:&arr表示整个数组的地址,从元素'a'向后数字符,到'\0'结束
printf("%d\n", strlen(&arr+1));     //随机值 注:&arr+1表示跳过整个数组,从元素'\0'向后数字符
printf("%d\n", strlen(&arr[0]+1));  //5 注:&arr[0]+1表示从元素'b'向后数字符,到'\0'结束


char *p = "abcdef";  //p里面存的是字符a的地址
printf("%d\n", sizeof(p));        //4 注:p是指针变量
printf("%d\n", sizeof(p+1));      //4 注:p+1表示b的地址
printf("%d\n", sizeof(*p));       //1 注:*p表示首元素,即元素'a'   
printf("%d\n", sizeof(p[0]));     //1 注:p[0]相当于*[p+0],表示首元素,即元素'a'
printf("%d\n", sizeof(&p));       //4 注:&p表示p的地址,p是char *类型的
printf("%d\n", sizeof(&p+1));     //4 注:&p+1表示地址(跳过一个p)
printf("%d\n", sizeof(&p[0]+1));  //4 注:&p[0]+1表示元素'b'的地址

printf("%d\n", strlen(p));        //6 注:p表示元素'a'的地址,从元素'a'向后数字符,到'\0'结束
printf("%d\n", strlen(p+1));      //5 注:p+1表示元素'b'的地址,从元素'b'向后数字符,到'\0'结束
printf("%d\n", strlen(*p));       //error 注:*p表示首元素
printf("%d\n", strlen(p[0]));     //error 注:p[0]表示首元素
printf("%d\n", strlen(&p));       //随机值 注:&p表示p的地址
printf("%d\n", strlen(&p+1));     //随机值 注:&p+1表示地址(跳过p)
printf("%d\n", strlen(&p[0]+1));  //5 注:&p[0]+1表示元素'b'的地址,从元素'b'向后数字符,到'\0'结束

二维数组

int a[3][4] = {0};
printf("%d\n", sizeof(a));        //48 注:a表示整个数组
printf("%d\n", sizeof(a[0][0]));  //4  注:a[0][0]表示第一行第一个元素
printf("%d\n", sizeof(a[0]));     //16 注:a[0]表示第一行   
printf("%d\n", sizeof(a[0]+1));   //4  注:a[0]+1表示第一行第二个元素的地址
printf("%d\n", sizeof(a+1));      //4  注:a+1表示第二行的地址
printf("%d\n", sizeof(&a[0]+1));  //4 注:&a[0]+1表示第二行的地址
printf("%d\n", sizeof(*a));       //16 注:*a表示第一行
printf("%d\n", sizeof(a[3]));     //16 注:a[3]相当于a[1],sizeof内部表达式不参与运算

阅读更多
上一篇c语言操作符
下一篇用C语言实现小游戏扫雷
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭