一维数组:
1.数组不能写0大小,arr[0] ---->
这样写是错误的
解释:
(1)
你要申请开辟一个空间,但你开辟得到空间是0个大小,没办法开辟,没发访问元素
(2)int arr1[0];
int arr2[0]; 这两个在内存中可能会发生冲突
2. 3. int arr[0]={0};
为什么在整形数组里每个元素之间差4个字节?
因为该数组是整形,1个元素占4个字节,1个字节给1个地址,所以地址之间差4。
4. *arr 和 *(arr+0) 和 arr[0] 这三者是一样的,都代表首元素
arr+i ------> 是下标为i元素的地址
*(arr+i)------> 是下标为i的元素
二维数组:
如 int arr[5][3];
我们知道,对于一位数组的长度是sizeof(arr)/sizeof(arr[0]) ,那二维数组的长度呢?
行: sizeof(arr)/sizeof(arr[0]) //sizeof(arr)是整个数组所占的字节,arr[0]是该二维数组第一行的起始地址,也可以说是第一行这个一维数组的数组名,所以sizeof(arr[0])是第一行所占的字节大小,整个数组的大小除以第一行所占字节的大小就是该数组的行数。
列: sizeof(arr[i])/sizeof(arr[i][0]) //i可以是该数组的某行,
sizeof(arr[i])和上面一样,
arr[i]是该二维数组第某行的起始地址,也可以说是第某行这个一维数组的数组名,所以sizeof(arr[i])是第一行所占的字节大小,sizeof(arr[i][0]) 是该行的第一个元素所占的自己。一行所占的字节除以一个元素的所占的字节就是改行的有多少个元素,也就是该数组有多少列。
关于sizeof的问题:
(1)sizeof(数组名)------数组名表示整个数组
此时 sizeof(数组名) 求取的是整个数组的大小,单位是字节
(2)&数组名--------数组名也表示整个数组
此时 &数组名 求取的是整个数组的地址
(3)除此之外,所有遇到的数组名都是首元素的地址
//一维数组
int a[] = {1,2,3,4};
printf("%d\n",sizeof(a)); //16,整个数组的大小
printf("%d\n",sizeof(a+0)); // 4,第一个元素地址所占的字节
printf("%d\n",sizeof(*a)); //4,第一个元素所占的字节大小
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,取出的是整个数组的地址,只要是地址就是4(在VC6.0上是16,这是一个bug)
printf("%d\n",sizeof(*&a)); //16,&a是整个数组的地址,*&a是整个数组
printf("%d\n",sizeof(&a+1)); //4,&a是整个数组的地址,&a+1是下一个数组的地址
printf("%d\n",sizeof(&a[0])); //4,第一个元素所占的大小
printf("%d\n",sizeof(&a[0]+1)); //4,第二个元素所占的大小
printf("%d\n",sizeof(a[1]));//4 ,第二个元素所占的字节大小
printf("%d\n",sizeof(&a)); // 4,取出的是整个数组的地址,只要是地址就是4(在VC6.0上是16,这是一个bug)
printf("%d\n",sizeof(*&a)); //16,&a是整个数组的地址,*&a是整个数组
printf("%d\n",sizeof(&a+1)); //4,&a是整个数组的地址,&a+1是下一个数组的地址
printf("%d\n",sizeof(&a[0])); //4,第一个元素所占的大小
printf("%d\n",sizeof(&a[0]+1)); //4,第二个元素所占的大小
//字符数组
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr)); //6,整个数组的大小
printf("%d\n", sizeof(arr+0)); //4,第一个元素地址所占的大小,注意:不管是整形变量还是字符变量他们地址的大小都是4
printf("%d\n", sizeof(*arr)); //1,第一个元素所占的字节
printf("%d\n", sizeof(arr[1])); //1
printf("%d\n", sizeof(&arr)); // 4,数组的地址为4
printf("%d\n", sizeof(&arr+1)); //4,下一个数组的地址
printf("%d\n", sizeof(&arr[0]+1)); //4第二个元素的地址
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr)); //6,整个数组的大小
printf("%d\n", sizeof(arr+0)); //4,第一个元素地址所占的大小,注意:不管是整形变量还是字符变量他们地址的大小都是4
printf("%d\n", sizeof(*arr)); //1,第一个元素所占的字节
printf("%d\n", sizeof(arr[1])); //1
printf("%d\n", sizeof(&arr)); // 4,数组的地址为4
printf("%d\n", sizeof(&arr+1)); //4,下一个数组的地址
printf("%d\n", sizeof(&arr[0]+1)); //4第二个元素的地址
注意:strlen( ),括号里传的是地址
printf("%d\n", strlen(arr)); // 随机值,没有'\0'
printf("%d\n", strlen(arr+0)); //随机值,没有'\0',这两个都是从a那往后数,到'\0'那停止,但没找到'\0',所以是随机值
printf("%d\n", strlen(*arr)); //错误的写法,必须传地址,它传的是a的ASC码值97,会和内存里地址为97的发生冲突
printf("%d\n", strlen(arr[1]));//错误,这个传的是b的ASC码值98
printf("%d\n", strlen(&arr)); //随机值(从a开始往后数)
printf("%d\n", strlen(&arr+1)); //随机值,比上一个随机值小6
printf("%d\n", strlen(&arr[0]+1)); //随机值,比上上个随机值小1 (从b开始往后数)
printf("%d\n", strlen(arr+0)); //随机值,没有'\0',这两个都是从a那往后数,到'\0'那停止,但没找到'\0',所以是随机值
printf("%d\n", strlen(*arr)); //错误的写法,必须传地址,它传的是a的ASC码值97,会和内存里地址为97的发生冲突
printf("%d\n", strlen(arr[1]));//错误,这个传的是b的ASC码值98
printf("%d\n", strlen(&arr)); //随机值(从a开始往后数)
printf("%d\n", strlen(&arr+1)); //随机值,比上一个随机值小6
printf("%d\n", strlen(&arr[0]+1)); //随机值,比上上个随机值小1 (从b开始往后数)
char arr[] = "abcdef";
printf("%d\n", sizeof(arr)); // 7,算'\0'
printf("%d\n", sizeof(arr+0)); // 4,首元素的地址
printf("%d\n", sizeof(*arr)); // 1,首元素所占的大小
printf("%d\n", sizeof(arr[1])); // 1,第二个元素所占的大小
printf("%d\n", sizeof(&arr)); // 4,数组的地址
printf("%d\n", sizeof(&arr+1)); //4,下一个数组的地址
printf("%d\n", sizeof(arr)); // 7,算'\0'
printf("%d\n", sizeof(arr+0)); // 4,首元素的地址
printf("%d\n", sizeof(*arr)); // 1,首元素所占的大小
printf("%d\n", sizeof(arr[1])); // 1,第二个元素所占的大小
printf("%d\n", sizeof(&arr)); // 4,数组的地址
printf("%d\n", sizeof(&arr+1)); //4,下一个数组的地址
printf("%d\n", sizeof(&arr[0]+1));// 4,第二个元素的地址
printf("%d\n", strlen(arr)); // 6,不算'\0'
printf("%d\n", strlen(arr+0)); // 6
printf("%d\n", strlen(*arr)); // 错误,只能传地址
printf("%d\n", strlen(arr[1])); // 错误
printf("%d\n", strlen(&arr)); // 6,从第一个元素开始数
printf("%d\n", strlen(&arr+1)); //随机值,下一个数组还没'\0'
printf("%d\n", strlen(&arr[0]+1)); //5,从第二个元素开始数
char *p = "abcdef";
(char *类型的指针变量+1跳一个字节)
printf("%d\n", sizeof(p)); // 4,指针变量的大小
printf("%d\n", sizeof(p+1)); //4,指向b的地址
printf("%d\n", sizeof(*p)); //1,第一个元素的大小,*p是指向第一个元素的
printf("%d\n", sizeof(p[0])); //1,p[0]就是首元素,与*(p+0)等价
printf("%d\n", sizeof(&p)); //4,指针变量的地址,二级指针
printf("%d\n", sizeof(&p+1)); //4
printf("%d\n", sizeof(&p[0]+1)); //4,b的地址
printf("%d\n", sizeof(p)); // 4,指针变量的大小
printf("%d\n", sizeof(p+1)); //4,指向b的地址
printf("%d\n", sizeof(*p)); //1,第一个元素的大小,*p是指向第一个元素的
printf("%d\n", sizeof(p[0])); //1,p[0]就是首元素,与*(p+0)等价
printf("%d\n", sizeof(&p)); //4,指针变量的地址,二级指针
printf("%d\n", sizeof(&p+1)); //4
printf("%d\n", sizeof(&p[0]+1)); //4,b的地址
printf("%d\n", strlen(p)); //6 ,从a的地址往后数
printf("%d\n", strlen(p+1));//5 ,从b的地址往后数
printf("%d\n", strlen(*p)); //错误
printf("%d\n", strlen(p[0]));//错误
printf("%d\n", strlen(&p)); //随机值,从指针的地址那块往后数,不知道是什么
printf("%d\n", strlen(&p+1));//随机值,
printf("%d\n", strlen(&p[0]+1));//5
//二维数组
int a[3][4] = {0};
printf("%d\n",sizeof(a)); //48,整个数组的大小
printf("%d\n",sizeof(a[0][0]));//4,第一个元素所占的大小
printf("%d\n",sizeof(a[0])); //16,a[0]可以看成是第一行元素的地址,那sizeof(a[0])就是整个一行的大小
printf("%d\n",sizeof(a[0]+1));//4,第一行第二个元素所占的大小
printf("%d\n",sizeof(a+1)); //4,第二行的地址
printf("%d\n",sizeof(&a[0]+1)); // 4,第二行的地址
printf("%d\n",sizeof(*a));// 16,*a是第一行首元素的地址
printf("%d\n",sizeof(a[3]));//16 ,第四行整个数组的大小,虽然没有第四行,sizeof()括号里不计算,它只是看一下,没有访问
int a[3][4] = {0};
printf("%d\n",sizeof(a)); //48,整个数组的大小
printf("%d\n",sizeof(a[0][0]));//4,第一个元素所占的大小
printf("%d\n",sizeof(a[0])); //16,a[0]可以看成是第一行元素的地址,那sizeof(a[0])就是整个一行的大小
printf("%d\n",sizeof(a[0]+1));//4,第一行第二个元素所占的大小
printf("%d\n",sizeof(a+1)); //4,第二行的地址
printf("%d\n",sizeof(&a[0]+1)); // 4,第二行的地址
printf("%d\n",sizeof(*a));// 16,*a是第一行首元素的地址
printf("%d\n",sizeof(a[3]));//16 ,第四行整个数组的大小,虽然没有第四行,sizeof()括号里不计算,它只是看一下,没有访问