关于数组必须学会的运算

来源:互联网 发布:幼猫吃什么猫粮好 知乎 编辑:程序博客网 时间:2024/06/06 07:26

一位数组数组名单独在sizeof()中,代表整个数组

二维数组a[][],把a[]看成数组名,sizeof(a)中,数组名代表二维数组的首元素地址,也就是第一行数组的地址。

例如a[3][4],a代表二维数组首元素地址,也是第一行数组的地址,而a+1则代表第一行地址+1,就是第二行地址,两个地址相差4个int大小,也就是16个字节。

sizeof求数组大小是要包括\0的,而strlen求数组大小是不包括\0的,但是以\0作为结束标识。同时strlen括号中

为地址。

int a[] = { 1, 2, 3, 4 };printf("%d\n", sizeof(a));        //  16  数组名单独放在sizeof中代表整个数组,求数组大小,以字节为单位,应该为16printf("%d\n", sizeof(a + 0));    //  4 数组名不是单独放在sizeof中,代表数组第一个元素的地址,指针类型,为4printf("%d\n", sizeof(*a));       //  4 *为截引用符号,a代表首元素地址,对首元素地址截引用就是首元素,int类型,大小为4,因此也为4printf("%d\n", sizeof(a + 1));    //  4 a不是单独在sizeof中,a代表首元素地址,a+1代表第二个为元素地址,指针类型,为4printf("%d\n", sizeof(a[1]));     //  4 代表第二个元素,是int类型,大小为4printf("%d\n", sizeof(&a));       //  4 数组地址的地址,为4printf("%d\n", sizeof(&a + 1));   //  4 数组地址+1,就跳出这个数组的地址,仍然为地址,为4printf("%d\n", sizeof(&a[0]));    //  4 对首元素取地址,等价于a,为4printf("%d\n", sizeof(&a[0] + 1));//  4 首元素地址+1,第二个元素的地址,也为4

char arr[] = {'a','b','c','d','e','f'};printf("%d\n", sizeof(arr));        //代表整个数组,为6printf("%d\n", sizeof(arr+0));      //第一个元素地址,为4printf("%d\n", sizeof(*arr));       //对第一个元素地址截引用,为a多的大小,为1printf("%d\n", sizeof(arr[1]));     //第二个元素,b的大小,为1printf("%d\n", sizeof(&arr));       //对整个数组取地址,4printf("%d\n", sizeof(&arr+1));     //整个数组地址+1,跳出数组,依然是地址,为4printf("%d\n", sizeof(&arr[0]+1));  //第一个元素地址+1,代表第二个元素地址,为4printf("%d\n", strlen(arr));        //从a的地址开始,遇到\0结束,生成随机数printf("%d\n", strlen(arr + 0));    //从a的地址开始,遇到\0结束,生成随机数//printf("%d\n", strlen(*arr));       //报错,strlen应该从地址开始,如果是元素就错误,程序崩溃//printf("%d\n", strlen(arr[1]));     //等价于*arr,程序崩溃printf("%d\n", strlen(&arr));         //整个数组的地址,遇到\0结束,生成随机数printf("%d\n", strlen(&arr + 1));     //数组的地址+1,跳出数组,依然是遇到\0结束,生成随机数printf("%d\n", strlen(&arr[0] + 1));  //第一个元素地址+1,第二个元素的地址,遇到\0结束,随机数


char *p = "abcdef";                     //默认有\0结束printf("%d\n", sizeof(p));              //指针p,a的地址,大小为4printf("%d\n", sizeof(p + 1));          //a的地址+1,b的地址,大小为4printf("%d\n", sizeof(*p));             //对a地址的截引用,为char类型,大小为1printf("%d\n", sizeof(p[0]));           //a,char类型,大小为1printf("%d\n", sizeof(&p));             //p的指针,大小为4printf("%d\n", sizeof(&p + 1));         //p的指针+1,跳出p,依然为指针,大小为4printf("%d\n", sizeof(&p[0] + 1));      //首元素地址+1,依然是指针,大小为4printf("%d\n", strlen(p));              //a的地址,遇到\0结束,但不包括\0,大小为6printf("%d\n", strlen(p + 1));          //b的地址,遇到\0结束,大小为5//printf("%d\n", strlen(*p));           //a,strlen(地址),a不是地址,程序奔溃//printf("%d\n", strlen(p[0]));         //等价于*p,a不是地址,程序奔溃printf("%d\n", strlen(&p));             //p的地址,二级指针,有警告,级别不同,生成随机数printf("%d\n", strlen(&p + 1));         //p的地址+1,跳出p,二级指针,有警告,级别不同,生成随机数printf("%d\n", strlen(&p[0] + 1));      //b的地址,从b开始,大小为5


////二维数组 //int b[3][4] = {0};  //printf("%d\n", sizeof(b));               //代表整个数组,大小为48//printf("%d\n", sizeof(b[0][0]));         //第一个元素,下表为[0][0],大小为4//printf("%d\n", sizeof(b[0]));            //把a[0]看成数组名,单独在sizeof中,代表整个数组a[0]大小为16//printf("%d\n", sizeof(b[0] + 1));        //a[0]看成数组名,不是单独在sizeof中,代表a[0]一位数组的地址,指针类型,大小为4//printf("%d\n", sizeof(b + 1));           //指针类型,大小为4//printf("%d\n", sizeof(&b[0] + 1));       //对第一行元素取地址,+1后还是地址,等价于a+1,大小为4//printf("%d\n", sizeof(*b));              //a代表第一行元素,*截引用,为第一行元素,大小为16//printf("%d\n", sizeof(b[3]));            //越界,但是编译不占内存,大小为16

int b[3][4] = { 0 };printf("%p\n", b );                      //a代表二维数组的第一行地址printf("%p\n", b + 1);                   //a+1代表二维数组第一行地址+1,比第一行地址大16


1 0
原创粉丝点击