结构体 数组名与指针区别

转自http://blog.sina.com.cn/s/blog_4badbe8e0100qb0s.html

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];

而结构体的类型是结构体本身,

原文地址:https://www.cnblogs.com/viviwind/p/2643438.html