本文主要讲述在C/C++语言中,char** a 与 char* a[] 的区别。
1 char** a
在 char** a 中,a 是一个指针,这个指针(a)指向一块内存地址,该内存地址中存储的是 char* 类型的数据。指针的加减运算在这里的体现为:a + 1 表示地址加8字节(在32位系统中,地址加4字节)。
char* 也是一个指针,用 *a 表示,这个指针(*a)指向一块内存地址,该内存地址中存储的是 char 类型的数据。指针的加减运算在这里的体现为:(*a) + 1 表示地址加1字节。
说明:
- 在32位系统中,一个指针占用4字节;在64位系统中,一个指针占用8字节;
- 由于a指向一个指针类型(char*),故 a + 1 操作就是对指针类型的地址进行操作,所以 a + 1 表示地址加8字节;*a指向一个char类型,char类型占用1个字节,故 *a + 1操作就是对char类型的地址进行操作,所以 *a + 1表示地址加1字节。
2 char* a[]
在 char* a[] 中,a是数组,数组中的元素是指针,这些指针指向char类型的数据。
说明:
- 数组里面所有的元素,在内存中都是是连续存放的;
- 数组名在C语言中做了特殊处理,数组名使用数组所占用的(连续)内存区域的第一个字节的内存地址替代了。例如,数组占用的内存区域是 0x7fff5da3f550 到 0x7fff5da3f5a0,那么数组名a就会被替换成首地址 0x7fff5da3f550;
- a+1 表示数组a的第二个元素的内存地址,所以 a + 1 是地址加8字节(再次说明,因为数组a的元素是指针(char*),指针类型占用8字节(64位内存地址));
- char* a[10] 表示限定这个数组最多可以存放10个指针(char*)元素,也就是说这个数组会占用 10*8 = 80 个字节。
3 两者区别与联系
3.1 赋值
可以使用 char* a[] 给 char** 赋值,代码如下:
char* a[] = {"hello world", "liitdar"};
char** b = a;
但不能使用 char** 给 char* a[] 赋值,因为在 char* a[] 中,a作为数组名,是一个常量,我们不能给常量赋值。
3.2 作为程序入参
两者都可以作为程序的入参,用于接收用户执行程序时输入的参数,通常在 main 函数中使用,代码如下:
int main(int argc, char ** argv)
或:
int main(int argc, char *argv[])