1

数组和指针的异同

 3 years ago
source link: https://www.maixj.net/ict/shuzu-zhizhen-24296
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

数组和指针的异同

2021年1月3日 / 3次阅读CC++

编写C语言代码,数组和指针可能是最trick的地方,它们本质上相同,但用法细节上有一点点不同。

char *k;

定义一个指针。还可以初始化:

char *k = malloc(N);

指针k指向N bytes大小的内存块。

访问指针指向的内容,既可以是指针风格,也可以是数组风格:

*(k+i)和k[i],这两种写法含义相同。

【k+i,就是非常重要的 pointer arithmatic operation,它表示移动一个sizeof(type of pointer)的距离】

-----------分割一下-----------

char k[N];

定义一个字符数组。数组的定义,必须在初始化是指定大小,下面这个定义是错的:

char k[];   // 错误的定义

还可以这样来定义并初始化数组:

char k[] = {'a','b','c','d'};

编译器能够处理这种定义风格,自动计算出这个数组的大小。

访问数组的内容,既可以是数组风格,也可以是指针风格:

k[i]和*(k+i),也是一样的!k就是指向数组开始地址的指针。

------------分割一下------------

上面一段那种错误的定义数组的方式,在作为函数入参申明的时候,就成了正确的了:

void function(char *k)
void function(char k[])

以上两种写法,都正确,语义也是一样的!

------------分割一下------------

定义一个字符串数组:

char k[] = "abcdefg";  // just big enough to hold abcdefg  and '\0'

定义一个指针,指向一个字符串常量:

char *k = "abcdefg";

以上两种定义方式的区别在于,字符串数组的定义方式可以修改字符串的内容,而指针定义的方式,本质上是定义了一个指针,指向一个字符串常量,如果修改k的指向,会导致这个字符串常量永远无法再被访问,如果修改这个字符串常量,C89的资料说,这是undefined的行为,gcc测试结果,segmentation fault。


Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK