数组和指针的异同
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.
数组和指针的异同
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
-
8
C语言的数组指针能带来什么好处?为什么要使用它? 发表于 2019-09-16 19:09...
-
21
c语言入门22,三分钟分清数组指针和指针数组,绕口令名字谁取的 发表于 2018...
-
9
golang的数组和指针的问题,求解答 txgu · 45分钟之前 · 39 次点击 · 预计阅读时间不到 1 分钟 ·...
-
3
Rust 中几个智能指针的异同与使用场景 2020-01-16 想必写过 C 的程序员对指针都会有一种复杂的情感,与内存相处的过程中可以说是成也指针,败也指针。一不小心又越界访问了,一不小心又读到了内存里的脏数据,一不小心多线程读写数据又...
-
4
Go 1.17新特性详解:支持将切片转换为数组指针 八月 18, 2021 0 条评论
-
5
Summary1)数组是一段连续的内存空间,数组的元素个数为 #define DIM(a) (sizeof(a) / sizeof(*a)) 2)指针是一种特殊的变量,与整数的运算规则为: p + n; <--> (unsigned int)p...
-
3
数组和指针,内存之间的关系
-
7
# 前言结论 在面对MongoDB的集合字段交互时,我们可能会接触到$push与$addToSet两个方法,两个方法看似功能差不多,实际使用场...
-
7
【这些题我一拿到手就会】C指针和数组试题详解(下)
-
6
数据结构与算法中数组(Array)问题总结归纳。 Remove Duplicates from Sorted ArrayDescri...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK