数组名、引用与指针区别

数组名与指针区别

举例

1
2
char a[10];
char *p;
  • 数组名具有常量性,相当于T* const
  • 数组名作为函数参数时,常量性被摘除,与普通指针相同
  • 数组名不是变量,不能做左值,因此不能自增自减之类操作
  • sizeof(数组名) 得到数组大小,sizeof(指针) 得到指针大小
  • &p得到指针的地址;&a得到数组地址

数组名与数组指针区别

举例:

1
2
char (*pa)[4];  // 数组指针,指向数组的起始地址
char a[4]; // 数组名,指向数组首元素地址
  • 运算方式不同。a+1,a的地址偏移一个char大小(1字节);pa+1,pa的地址偏移一个指针大小(4字节)

  • 是两种不同类型,如

    1
    2
    3
    4
    void f3(int (*p)[4]);
    int b[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
    f3(b[1]); // 编译出错
    f3(&b[1]); // 正确
  • 不能直接赋值,如pa = a;,但可以pa = &a;。从上面例子也可看出。

数组指针与指针数组区别

举例:

1
2
char (*pa)[4];  // 数组指针,pa指向大小为4的char数组的起始地址
char * pb[4]; // 指针数组,数组内存放的是char*指针,pb指向数组首元素地址
  • pa是一个指针,指向一个char [4]的数组,每个数组元素是一个char类型的变量
  • 如果一个数组的每一个元素都是指针,则这个数组是一个指针数组,如pb

引用与指针区别

引用很容易与指针混淆,它们之间有三个主要的不同:

  • 不存在空引用。引用必须连接到一块合法的内存。
  • 一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。
  • 引用必须在创建时被初始化。指针可以在任何时间被初始化。
------ 本文结束------
赞赏此文?求鼓励,求支持!
0%