从一道小题下手(该考点曾被腾讯等大公司作为基础笔试题考过), #include <stdio.h>int size(char a[10])
{
return sizeof(a);
}int main(void)
{
char a[] = {"C","h","i","n","a"," "};
char *p = "China";
char *q = a; printf("sizeof(a)=%d
", sizeof(a));
printf("sizeof(p)=%d
", sizeof(p));
printf("sizeof(q)=%d
", sizeof(q));
printf("size(a)=%d
", size(a)); return 0;
}
在32位机的编译环境下,对C语言很熟悉的人一眼就能看出结果为:
sizeof(a)=6
sizeof(p)=4
sizeof(q)=4
size(a)=4
基于本小题,主要考究以下几点:
数组名退化成指针
仅在以下3种情况中,数组不会退化成指针,
1.
使用sizeof(a)的时候,所以上面sizeof(a)的结果为6字节
2.
对数组名取地址操作:&a。&a的类型为pointer to array of 6 chars,而对字符串指针取地址结果为pointer to pointer to char.
3.
使用字符串初始化数组的时候也不会退化。
其它情况都会退化成“指向数组首元素的指针”,比如:
1.
数组名做函数参数时,a都会退化成&a[0]指针。如上面的size函数和printf函数中的a[]都是这种情况
2.
二维数组,char s[10][8]数组的首元素(得理解这个首元素,从一维数组的角度看的)是一维数组s[0],因此退化成&s[0]指针
数组定义字符串和指针定义字符串的区别
1.
使用数字定义的字符串只分配字符串所需的空间(上例中为6个字节),数字名没有单独的存储空间;使用指针定义字符串,除了字符串占用的空间,还要为指针变量分配对应的空间。
2.
数组退化成指针为“常量指针”,不可更改,而直接指向字符串的指针可修改,如
char a[10] = "China";
char *p = "China";
a++; // 错误的
p++; // 正确的C++对象数组的实例学习 http://www.linuxidc.com/Linux/2014-06/102590.htmC语言向有序数组中插入一个数使该数组仍保持有序 http://www.linuxidc.com/Linux/2014-05/102409.htmC语言用一维数组和二维数组打印杨辉三角 http://www.linuxidc.com/Linux/2014-05/102382.htmC语言 字符数组和字符串 http://www.linuxidc.com/Linux/2014-05/101926.htmC++指针与数组的联系和区别 http://www.linuxidc.com/Linux/2014-05/101537.htm本文永久更新链接地址:http://www.linuxidc.com/Linux/2014-06/103115.htm