zoukankan      html  css  js  c++  java
  • 结构体 数组名与指针区别

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

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

  • 相关阅读:
    FTPClient FTPFile 找不到符号
    1.4 Spring 依赖注入(DI)和控制反转(IOC)详解
    1.3使用marven Spring项目快速搭建
    1.1Spring历史发展和模块定义
    @Component、@Service、@Controller、@Rrepository说明
    打板炒股方法
    性能测试Jmeter扩展学习-添加自定义函数
    性能测试day07_性能瓶颈和分析
    性能测试day06_需求设计的学习(性能重中之重,思维方向永远重于工具)
    性能监控扩展篇(grafana + influxdb + telegraf)
  • 原文地址:https://www.cnblogs.com/viviwind/p/2643438.html
Copyright © 2011-2022 走看看