数组名与指针区别
举例
1 | char a[10]; |
- 数组名具有常量性,相当于
T* const
- 数组名作为函数参数时,常量性被摘除,与普通指针相同
- 数组名不是变量,不能做左值,因此不能自增自减之类操作
- sizeof(数组名) 得到数组大小,sizeof(指针) 得到指针大小
- &p得到指针的地址;&a得到数组地址
数组名与数组指针区别
举例:
1 | char (*pa)[4]; // 数组指针,指向数组的起始地址 |
运算方式不同。a+1,a的地址偏移一个char大小(1字节);pa+1,pa的地址偏移一个指针大小(4字节)
是两种不同类型,如
1
2
3
4void 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 | char (*pa)[4]; // 数组指针,pa指向大小为4的char数组的起始地址 |
- pa是一个指针,指向一个char [4]的数组,每个数组元素是一个char类型的变量
- 如果一个数组的每一个元素都是指针,则这个数组是一个指针数组,如pb
引用与指针区别
引用很容易与指针混淆,它们之间有三个主要的不同:
- 不存在空引用。引用必须连接到一块合法的内存。
- 一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。
- 引用必须在创建时被初始化。指针可以在任何时间被初始化。