问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

c语言中怎样理解数组和指针

发布网友 发布时间:2022-03-29 08:59

我来回答

5个回答

热心网友 时间:2022-03-29 10:28

数组和指针的关系

一、数组的数组名其实可以看作一个指针。看下例:

例1:

int array[10]={0,1,2,3,4,5,6,7,8,9},value;

value=array[0];//也可写成:value=*array;

value=array[3];//也可写成:value=*(array+3);

value=array[4];//也可写成:value=*(array+4);

上例中,一般而言数组名array代表数组本身,类型是int [10],但如果把array看做指针的话,它指向数组的第0个单元,类型是int *,所指向的类型是数组单元的类型即int。因此*array等于0就一点也不奇怪了。同理,array+3是一个指向数组第3个单元的指针,所以*(array+3)等于3。其它依此类推。

二、指针数组的定义及使用

例2:

char *str[3]={ //注意指针数组的定义及初始化格式

"Hello,this is a sample!",

"Hi,good morning.",

"Hello world"

};

char s[80];

strcpy(s,str[0]);//也可写成strcpy(s,*str);

strcpy(s,str[1]);//也可写成strcpy(s,*(str+1));

strcpy(s,str[2]);//也可写成strcpy(s,*(str+2));

上例中,str是一个三单元的数组,该数组的每个单元都是一个指针,这些指针各指向一个字符串。把指针数组名str当作一个指针的话,它指向数组的第0号单元,它的类型是char**,它指向的类型是char *。
*str也是一个指针,它的类型是char*,它所指向的类型是char,它指向的地址是字符串"Hello,this is a sample!"的第一个字符的地址,即'H'的地址。 str+1也是一个指针,它指向数组的第1号单元,它的类型是char**,它指向的类型是char *。

*(str+1)也是一个指针,它的类型是char*,它所指向的类型是char,它指向"Hi,good morning."的第一个字符'H',等等。

三、数组名小结:
声明了一个数组TYPE array[n],则数组名称array就有了两重含义:第一,它代表整个数组,它的类型是TYPE [n];第二,它是一个指针,该指针的类型是TYPE*,该指针指向的类型是TYPE,也就是数组单元的类型,该指针指向的内存区就是数组第0号单元,该指针自己占有单独的内存区,注意它和数组第0号单元占据的内存区是不同的。该指针的值是不能修改的,即类似array++的表达式是错误的。

在不同的表达式中数组名array可以扮演不同的角色。

(1)在表达式sizeof(array)中,数组名array代表数组本身,故这时sizeof函数测出的是整个数组的大小。

(2)在表达式*array中,array扮演的是指针,因此这个表达式的结果就是数组第0号单元的值。sizeof(*array)测出的是数组单元的大小。

(3)表达式array+n(其中n=0,1,2,....。)中,array扮演的是指针,故array+n的结果是一个指针,它的类型是TYPE*,它指向的类型是TYPE,它指向数组第n号单元。故sizeof(array+n)测出的是指针类型的大小。

四、数组指针的定义及使用:

例3:

int array[10];

int (*ptr)[10]; //数组指针ptr,指向一个数组int[10]

ptr=&array;

上例中ptr是一个指针,它的类型是int (*)[10],他指向的类型是int [10],我们用整个数组的首地址来初始化它。在语句ptr=&array中,array代表数组本身。

五、对指针和数组执行sizeof操作的结果:
sizeof(指针名称)测出的究竟是指针自身类型的大小呢还是指针所指向的类型的大小?答案是前者。例如:

int (*ptr)[10];

则在32位程序中,有:

sizeof(int(*)[10])==4

sizeof(int [10])==40

sizeof(ptr)==4

实际上,sizeof(对象)测出的都是对象自身的类型的大小,而不是别的什么类型的大小。

热心网友 时间:2022-03-29 11:46

数组(array),用于存储一组数据,其中的元素拥有相同的数据类型。
指针(point),可以理解为一个连接,它指向特定的数据——指针里存储的不是特定数据本身,而是特定数据的地址,从而指针可以指向特定数据。

在C中,数组里的元素个数是必须预先设定的,这样以来,对于需要动态设定元素个数的程序会造成不必要的开支。譬如,一个学生管理系统,若学生的数据结构采用“结构体数组”来管理,必然需要在程序编译前(也就是在源代码中)设定数组长度,这是不实用的,于是,对于这样的问题,可以采用“结构体链表”(一种用指针链接起来的数据结构),从而可实现数据的动态内存分配。

指针最大的应用莫过于链表了,相比数组而言,链表多了一个指针数据域,而且需要更复杂的插入、删除元素等的操作,如果你要说这是在浪费内存空间,那我也没办法;而事实上,很多时候在具体工程中我们需要的是链表而不是数组。

明白这里面的原理,你才能在具体应用中具体问题具体分析。

如果你还有什么不懂的,建议你翻开教材“数组”、“指针”单元,多看几遍,直到看懂为止。

Point is very important for C. Good luck!

热心网友 时间:2022-03-29 13:21

我就说的简单点吧
你可以认为数组名就是一个指针,其实也真的是这样,而它是一个常量,始终指向数组的首元素的地址.记住,它是不可以副值的,因为是常量.
而指针和数组名的区别就是,它是变量.
这两个在使用时的注意点就在初始化的时候.要非常小心.

热心网友 时间:2022-03-29 15:12

通俗点讲,内存就是很多个小盒子,数组就是一排排好队的小盒子,每个小盒子里面放一个东西而且小盒子都有个编号,从0开始,第0个,第1个,第2个...,小盒子排好队以后就不会动了,通过编号来打小盒子拿里面的东西。

指针就是一把打开盒子的钥匙,一个指针能且只能打开一个盒子,通过指针打开盒子就能从盒子里拿东西了。

热心网友 时间:2022-03-29 17:20

有一句话很重要,指针和数组可以相互替换
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
那个手机软件可以免费连联通的wifi啊 杀死比尔1里 女主角跟日本女人打的时候穿的那个黄色的鞋子是什么牌子的... 杀死比尔I精彩花絮 ro1压力变送器哪里能维修 手机可以转换繁体字直接同步到QQ网名上吗? 关于初中生之间打架,老师、家长和孩子之间应该怎么解决问题?老师的处 ... 超市买牙刷如有艾兹刷牙会感染吗。 象屿珑庭交通方便吗?应该怎么过去? ...扭伤的时候肿的和一个鸡蛋那么大,去拍了片,骨头没问题,后来去中医院... 脚扭伤快两个月了,骨头没事,走路还是疼,稍微以活动就肿,休息一晚上就好... 航班H176是从上海飞往什么城市的航班? 如何辨别空客和波音飞机 波音上半年收获多少架客机订单? 你期待国内的航空公司购买空客A350-1000、波音787-... 波音、空客各机型的售价是多少? 空客与波音的驾驭操作是一样的吗?是否有什么区别? 如何评价空客A220(系列)客机 DNF10周年代币券怎么花最划算 赠送的十周 德拉诺格斗士饰品怎么获得 英雄联盟十周年合影怎么删除 LOL十周年神秘礼物领取不了 为什么无法领取礼物 dnf10周年站街送啥 从游戏IP到“动画剧集”《双城之战》的突破有多大? 种花用的氮肥和钾肥各指什么? 氮肥和磷肥还有钾肥,哪一种肥料对植物的生长好处... 哪种化肥含钾最高? 哪种钾肥适合香蕉种植 C语言中数组名代表什么,数组元素用什么方法表示? 潮州的朋友来,毕业了想开同学会不知道去哪,请问... 厨房水台感觉怎么样。。我刚来一天工作大师傅安排... 腌鸡蛋的盐用粗盐还是细盐? 用盐水腌鸡蛋的做法 腌咸鸡蛋用什么盐好?用多少盐合适? 腌鸡蛋使用熟鸡蛋好还是用生鸡蛋好? 腌鸡蛋是用生鸡蛋还是熟鸡蛋?? 腌鸡蛋一斤鸡蛋放多少盐合适 快速腌鸡蛋最好的方法 用哪些方法腌鸡蛋,才能让鸡蛋出油还好吃? 腌鸡蛋都放哪些香料? 腌鸡蛋用多少盐 腌鸡蛋有几种方法 腌咸鸡蛋时用什么器皿 腌鸡蛋的方法 腌鸡蛋方法 腌咸鸡蛋十斤鸡蛋放多少盐? C语言Array[myArray[2]]是什么意思 《紫微斗数》最新txt全集下载 渊澜道电子书txt全集下载 《百州大陆之楚战天下》最新txt全集下载 c语言中while(gets(array))什么意思