首页 » 信息技术 »

数组和指针的异同

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。

本文链接:https://www.maixj.net/ict/shuzu-zhizhen-24296

相关文章

留言区


前一篇:

-->只要几分钟回答问卷,就能轻松赚现金!

栏目精选

云上小悟,麦新杰的独立博客

Ctrl+D 收藏本页

栏目


©Copyright 麦新杰 Since 2014 云上小悟独立博客版权所有 备案号:苏ICP备14045477号-1。云上小悟网站部分内容来源于网络,转载目的是为了整合信息,收藏学习,服务大家,有些转载内容也难以判断是否有侵权问题,如果侵犯了您的权益,请及时联系站长,我会立即删除。

go to top