结构体 数组名与指针的区别

A、数组名不是指针。
B、数组名 是 不是指针的指针。
数组名本质:
(1)数组名的内涵在于其指代实体是一种数据结构,这种数据结构就是数组;
(2)数组名的外延在于其可以转换为指向其指代实体的指针,而且是一个指针常量;
(3)指向数组的指针则是另外一种变量类型(在WIN32平台下,长度为4),仅仅意味着数组的存放地址!
解析:
A
char str[10];
char *pStr = str;
sizeof(str); //值为10。对数组结构求长度。
sizeof(pStr); //值为4。指针变量的长度。
首先对sizeof,是操作符不是函数,siziof(char)是合法的,而如果是函数,函数输入的必须是实参。
B
char str1[10] = "I Love U";
char str2[10];
strcpy(str2,str1);
函数原形中能接纳的两个参数都为char型指针,而我们在调用中传给它的却是两个数组名!
其原因是数组名可以作为指针常量使用,即指针是常量。符合指向数组结构地址的特性。
本质:
1、数组名指代一种数据结构:数组
所以数组名是指向数据结构的指针,且是指针常量,所以不能作为累加来用,不能等同于指针,例如求长度sizeof。
2、数组名可作为指针常量
int intArray[10];
intArray++; //编译器会报错此条。数组名不能作为指针变量一样累加。数组名是指针常量。
3、数组名可能失去其数据结构内涵
数组名因为可以作为指针常量,所以可以作为实参进行传递指针,但是当传递进函数的时候,作为函数的形参,其自动换成了指针。数组名作为指针常量,可以作实参, 传递到函数的形参中,自动转换成指针变量。
void arrayTest(char str[])
{
cout << sizeof(str) << endl; //长度为4
}
int main(int argc, char* argv[])
{
char str1[10] = "I Love U";
arrayTest(str1);
return 0;
}
(1)数组名作为函数形参时,在函数体内,其失去了本身的内涵,仅仅只是一个指针;
(2)很遗憾,在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。
所以,数据名作为函数形参时,其全面沦落为一个普通指针!它的贵族身份被剥夺,成了一个地地道道的只拥有4个字节的平民。

结构体和指针
数组定义好了数组的类型。例如int a[10];
【结构体 数组名与指针的区别】 而结构体的类型是结构体本身,

    推荐阅读