C语言 总结数组指针相关知识点
结论
1:数组在内存中是连续存放的。
2:内存中的一个内存单元对应一个地址。
3:在32位平台上指针是4个字节,64位平台8个字节。
4;数组的数组名其实是数组首元素的地址。
数组名代表整个数组的时候只有两种情况:
1: sizeof(数组名),这里数组名表示整个数组。
2: &数组名,这里数组名表示整个数组。
例子:(32位)
#include<stdio.h> int main() { int a[] = {1,2,3,4}; // 一维数组 //(地址)int整形4个字节长度
printf("%d\n",sizeof(a)); //16 sizeof(数组名)代表整个数组,a的长度 printf("%d\n",sizeof(a+0)); //4 a[0]的地址的长度 printf("%d\n",sizeof(*a)); //4 ‘*’解引用,元素a[0]的长度 printf("%d\n",sizeof(a+1)); //4 第二个元素地址的长度 printf("%d\n",sizeof(a[1])); //4 第二个元素的长度 printf("%d\n",sizeof(&a)); //4 整个数组a的地址的长度 (取数组地址也是地址) printf("%d\n",sizeof(*&a)); //16 数组a的地址解引用是整个数组的长度 printf("%d\n",sizeof(&a+1)); //4 数组a的下一份空间的地址的长度 printf("%d\n",sizeof(&a[0])); //4 第一个元素的地址的长度 printf("%d\n",sizeof(&a[0]+1)); //4 第二个元素的地址的长度 return 0; }
2:
#include<stdio.h> #include<string.h> int main() { 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 解引用首元素a[0]的长度 printf("%d\n", sizeof(arr[1])); // 1 元素a[1]的长度 printf("%d\n", sizeof(&arr)); // 4 数组arr的地址的长度 printf("%d\n", sizeof(&arr+1)); // 4 数组arr的下一份空间的地址的长度 printf("%d\n", sizeof(&arr[0]+1));// 4 元素arr[1]的地址的长度 printf("%d\n", strlen(arr)); //随机值 随机值,没有'\0'结束字符产生随机值 printf("%d\n", strlen(arr+0)); //随机值 随机值 // printf("%d\n", strlen(*arr)); //err strlen操作接受地址,将a的ASCII码作为地址导致错误 // printf("%d\n", strlen(arr[1])); //err strlen操作接受地址,将b的ASCII码作为地址导致错误 printf("%d\n", strlen(&arr)); //随机值 从arr首元素地址开始,遇到第一个'\0'的长度 printf("%d\n", strlen(&arr+1)); //随机值 从arr的下一份地址空间的开始,遇到第一个'\0'的长度 printf("%d\n", strlen(&arr[0]+1));//随机值 从arr[1]开始,遇到第一个'\0'(不包括'\0')的长度
return 0;
}
3:
#include<stdio.h> #include<string.h> int main() { char arr[] = "abcdef"; //此处定义字符串,结尾处自动补 '\0 ' printf("%d\n", sizeof(arr)); //7 arr的长度,含'/0' printf("%d\n", sizeof(arr+0)); //4 arr[0]的地址的长度 printf("%d\n", sizeof(*arr)); //1 arr[0]的长度 printf("%d\n", sizeof(arr[1])); //1 arr[1]的长度 printf("%d\n", sizeof(&arr)); //4 arr的地址的长度 printf("%d\n", sizeof(&arr+1)); //4 arr的下一份地址空间的地址的长度 printf("%d\n", sizeof(&arr[0]+1));//4 arr[1]的地址的长度 printf("%d\n", strlen(arr)); //6 arr的长度(不包括'\0') printf("%d\n", strlen(arr+0)); //6 从arr[0]起到第一个'\0'之间的长度 // printf("%d\n", strlen(*arr)); //errr strlen操作接受地址,将a的ASCII码作为地址导致错误 // printf("%d\n", strlen(arr[1])); //err strlen操作接受地址,将b的ASCII码作为地址导致错误 printf("%d\n", strlen(&arr)); //6 整个数组字符数 printf("%d\n", strlen(&arr+1)); //随机 跳过整个数组,遇见'\0'停止 printf("%d\n", strlen(&arr[0]+1)); //5 从第二个元素向后数 return 0; }
4:
5:#include<stdio.h> #include<string.h> int main() { char *p="abcdef"; //32位指针变量4个字节 printf("%d\n", sizeof(p)); //4 字符 'a' 地址的长度 printf("%d\n", sizeof(p+1)); //4 字符 'b' 的地址的长度 printf("%d\n", sizeof(*p)); //1 字符 'a' 的地址解引用一个字节 printf("%d\n", sizeof(p[0])); //1 字符 'a' 的长度 //p[0]==*(p+0)==*(0+p)==0[] printf("%d\n", sizeof(&p)); //4 指针p的地址的长度(p存的首元素地址,&p指向p的地址) printf("%d\n", sizeof(&p+1)); //4 指针p的地址的下一个地址空间的长度 printf("%d\n", sizeof(&p[0]+1));//4 字符'b'的地址的长度 printf("%d\n", strlen(p)); //6 p所指的字符串的首元素到'\0'(不包括''\0)的长度 printf("%d\n", strlen(p+1)); //5 p所指的字符串的第二个元素到'\0'(不包括''\0)的长度 //printf("%d\n", strlen(*p)); //err 对p所指的字符串的第一个字符'a'进行strlen操作,导致错误 //printf("%d\n", strlen(p[0])); //err p所指的字符串的第一个字符'a'进行strlen操作,导致错误 printf("%d\n", strlen(&p)); //随机值 从指针p的地址开始,遇到第一个'\0'的长度(而不是从p存的a的地址开始) printf("%d\n", strlen(&p+1)); //随机值 从指针p的地址的下一个地址空间开始,遇到第一个'\0'的长度 printf("%d\n", strlen(&p[0]+1));//5 从'b'开始,遇到第一个'\0'的长度 return 0; }
#include<stdio.h> #include<stdio.h> #include<string.h> int main() { int a[3][4] = {0}; //二维数组 (二维数组首元素是第一行) printf("%d\n",sizeof(a)); //48 整个二维数组的总长度 printf("%d\n",sizeof(a[0][0])); //4 a[0][0]的长度 printf("%d\n",sizeof(a[0])); //16 第0行的长度 printf("%d\n",sizeof(a[0]+1)); //4 a[0][1]的地址的长度 printf("%d\n",sizeof(a+1)); //4 第2行的地址的长度 printf("%d\n",sizeof(&a[0]+1)); //4 第2行的地址的长度 printf("%d\n",sizeof(*a)); //16 第0行的长度 printf("%d\n",sizeof(a[3])); //16 sizeof()内部不参与运算,并没有访问,相当于a[i]第i行,任意一行长度为16 return 0; }