对于部分和我一样的初学者,由于对数组、指针、单目操作符sizeof()、strlen()函数等知识的不熟悉,使得对数组相关的运算掌握的不够好,所以经过一段时间的学习,并且根据自己的理解,将一些相关的练习进行总结。总结如下:
在进行相关练习之前必须将这几个重要的知识点完全掌握:
1、sizeof()是一个操作符(不是函数),返回的为对象/类型的字节数
'\0'是字符串结束的标志,占一个字节。
2、strlen(地址)是一个函数,参数为地址,且求字符串长度时以‘\0’为结束标志,但不含'\0',
3、sizeof(arr) 和 &arr 时,arr 表示整个数组;除此之外,数组名都表示首元素的地址
4、对于指针 p[i] = *(p+i)
5、二维数组中,
- arr单独放在sizeof()内部时,arr表示整个数组
- arr 未单独放在sizeof()内部时,arr降级为首行元素的地址
- arr[0]单独放在sizeof()内部时,arr[0]表示首行元素
- arr[0]未单独放在sizeof()内部时,arr[0]降级为首元素的地址
- *(arr+i)为第i行的首元素地址
- (对数组中第i行的地址解以用得到该行的首元素地址)
下面则是我在vs2008中做过的一些练习、对应的结果及原因,将其总结如下:
一维数组
int a[] = {1,2,3,4};
- // printf("%d\n",sizeof(a)); //16 sizeof(arr)时,arr表示整个数组(表示整个数组的大小)
- // 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 &arr时,arr表示整个数组(取出整个数组的地址,还是地址
- // printf("%d\n",sizeof(*&a)); //16 对整个数组地址进行解以用,为整个数组的内容大小
- // printf("%d\n",sizeof(&a+1)); //4 跨过该数组地址后的地址
- // printf("%d\n",sizeof(&a[0])); //4 首元素的地址
- // printf("%d\n",sizeof(&a[0]+1)); //4 第二个元素的地址
char a[] = {'a','b','c','d','e','f'};
//类型发生变化,int四个字节,char一个字节
- // printf("%d\n",sizeof(a)); //6 sizeof(arr)时,arr表示整个数组(表示整个数组的大小)
- // printf("%d\n",sizeof(a+0)); //4 首元素地址
- // printf("%d\n",sizeof(*a)); //1 首元素内容
- // printf("%d\n",sizeof(a[1])); //1 第二个元素内容
- // printf("%d\n",sizeof(&a)); //4 &arr时,arr表示整个数组(取出整个数组的地址,还是地址)
- // printf("%d\n",sizeof(&a+1)); //4 跨过该数组地址后的地址
- // printf("%d\n",sizeof(&a[0]+1)); //4 第二个元素的地址
- //printf("%d\n",strlen(a)); //随机值19 1.strlen求长度时遇到'\0'才停下;无\0,产生随机值
- // printf("%d\n",strlen(a+0)); //随机值19 2.从第一个字符数起遇到\0; 1中将数组元素都数完遇到\0
- // printf("%d\n",strlen(*a)); //错 3.strlen函数的用法:strlen(地址)*a是地址对应的内容
- // printf("%d\n",strlen(a[1])); //错 4.同3
- // printf("%d\n",strlen(&a)); //随机数19 5.strlen(arr)同strlen(&arr)
- // printf("%d\n",strlen(&a+1)); //随机数13 6.原因同5,且相差6,跳过数组中的6的个元素,每个元素大小为1.
- // printf("%d\n",strlen(&a[0]+1)); //随机数18 7.原因同1,跳过第一个元素
char a[] = "abcdef";
//字符串在数组中存放时,默认会有一个'\0',占一个字节;
- // printf("%d\n",sizeof(a)); //7 sizeof(arr)时,arr表示整个数组(表示整个数组的大小)
- // printf("%d\n",sizeof(a+0)); //4 首元素地址
- // printf("%d\n",sizeof(*a)); //1 首元素内容
- // printf("%d\n",sizeof(a[1])); //1 第二个元素内容
- // printf("%d\n",sizeof(&a)); //4 &arr时,arr表示整个数组(取出整个数组的地址,还是地址)
- // printf("%d\n",sizeof(&a+1)); //4 跨过该数组地址后的地址
- // printf("%d\n",sizeof(&a[0]+1)); //4 第二个元素的地址
- // printf("%d\n",strlen(a)); //6 1.strlen求长度时遇到'\0'才停下;且不包含'\0'
- // printf("%d\n",strlen(a+0)); //6 2.从第一个字符数起遇到\0; 1中将数组元素都数完遇到\0
- // //printf("%d\n",strlen(*a)); //错 3.strlen函数的用法:strlen(地址)*a是地址对应的内容
- // //printf("%d\n",strlen(a[1])); //错 4.同3
- // printf("%d\n",strlen(&a)); //6 5.strlen(arr)同strlen(&arr)
- // printf("%d\n",strlen(&a+1)); //随机数12 6.跳过整个数组后,后面不可知。
- // printf("%d\n",strlen(&a[0]+1)); //5 7.原因同1,跳过第一个元素
char *p = "abcdef";
//字符串在数组中存放时,默认会有一个'\0',占一个字节;
- // printf("%d\n",sizeof(p)); //4 p为指针变量,内部存放的是首元素的地址;求得地址的大小
- // printf("%d\n",sizeof(p+1)); //4 p为指针变量,p+1内部存放的是第二个元素的地址;
- // printf("%d\n",sizeof(*p)); //1 *p表示第一个元素
- // printf("%d\n",sizeof(p[0])); //1 p[0]表示第一个元素
- // printf("%d\n",sizeof(&p)); //4 取出地址的地址,还是地址
- // printf("%d\n",sizeof(&p+1)); //4 地址(p存放一个地址,其类型为char *;对p求地址之后存放到 指针变量char * *pp 中。所以&p+1相当于跳过这个p指针)
- // printf("%d\n",sizeof(&p[0]+1)); //4 地址
- // printf("%d\n",strlen(p)); //6 1.strlen求长度时遇到'\0'才停下,且不包含'\0';无\0,随机值
- // printf("%d\n",strlen(p+1)); //5 2.从第2个字符数起遇到\0; 1中将数组元素都数完遇到\0
- // //printf("%d\n",strlen(*p)); //错 3.strlen函数的用法:strlen(地址) *p是地址对应的内容
- // //printf("%d\n",strlen(p[0])); //错 4.对于指针 p[i] = *(p+i)
- // printf("%d\n",strlen(&p)); //3 5.对地址取地址,未知
- // printf("%d\n",strlen(&p+1)); //随机数7 6.对地址取地址,未知
- // printf("%d\n",strlen(&p[0]+1)); //5 7.对地址取地址,未知
二维数组
int a[3][4] = {0};
- printf("%d\n",sizeof(a)); //48 sizeof(arr)时,arr表示整个数组(表示整个数组的大小)
- printf("%d\n",sizeof(a[0][0])); //4 首元素内容
- printf("%d\n",sizeof(a[0])); //16 第一行元素的内容大小
- 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 第一行元素的内容大小
- printf("%d\n",sizeof(a[3])); //16 此处a[3]只作为一种和a[0]相同的类型(a[3]表示第四行,但是不存在)
二维数组通过指针访问元素时,arr[i][j] = *( * (arr+i) +j )
以上的内容希望能对此方面不熟悉的朋友有所帮助,若有不对之处,请各位批评指正