C专家编程:第四章:数组和指针并不相同

本文探讨C语言中数组和指针的区别。声明与定义的差异,如数组名是左值但不可修改;在引用时,指针通过地址计算访问元素,而数组则直接访问。此外,指针定义不分配空间,但字符串常量初始化例外。数组可以被修改,而初始化的字符串常量数组则不应被修改。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、声明和定义:

声明相当于普通的声明:它所说明的并非自身,而是描述其他地方的创建的对象。

定义相当于特殊的声明:它为对象分配内存。

例如:定义:int  my_array[100];

    声明:extern int  my_array[ ];指代其他地方定义的对象。(二维数组需要提供除最左边一维之外的其他维的长度)

2、X = Y;

1)符号X是X所代表的地址,符号Y是Y代表的地址的内容;

2)X是左值,Y是右值;

3)左值在编译时可知,左值表示储存结果的地方,右值直到运行时才知,右值表示“Y的内容”。

注:数组名是左值,但不是可修改的左值,标准规定赋值符必须用可修改的左值作为它左边一侧的操作数。

3、当“以指针方式引用”时:

char  *p ="abcdefgh";

当书写了extern  char  *p,然后用 p[3] 来引用其中的元素时,编译器将会:

1)取得符号表中 p 的地址,提取存储于此处的指针。

2)把下标所表示的偏移量与指针相加,产生一个地址。

3)访问上面这个地址,取得字符。

编译器已被告知p 是一个指向字符的指针,(相反,数组定义告诉编译器 p 是一个字符序列)。

既然把p 声明为指针,那么不管p 原先是定义为指针还是数组,都会按照上面的三个步骤进行操作,但是只有当p原来定义为指针时这个方法才是正确的。

4、数组和指针的其他区别:

指针

数组

保存数据的地址

保存数据

间接访问数据,首先取得指针的内容,把它作为地址,然后从这个地址提取数据。

如果指针有一个下标[ I ],就把指针的内容加 I 作为地址,从中提取数据。

直接访问数据,a[ I ] 只是简单的以 a + I为地址取得数据。

通常用于动态数据结构

通常用于存储固定数目且数据类型相同的元素

相关的函数为 malloc(), free().

隐式分配和删除

通常指向匿名数据

自身即为数据名

 

5、数组和指针的定义:

1)定义指针时,编译器并不为指针所指向的对象分配空间,它只是分配指针本身的空间,除非在定义时同时给指针一个字符串常量进行初始化,如:

char *p = "breadfruit";  (为字符串常量分配了空间)

只有字符串常量才如此,不会为浮点数之类的常量分配空间,如:

float *pip = 3.141;      //编译出错

在ANSI C中,初始化指针时所创建的字符串常量被定义为只读。如果试图通过指针修改这个字符串的值,程序就会出现未定义的行为。

2)有字符串常量初始化的数组是可以修改的,如:

char  a[ ] ="gooseberry";

strncpy(a, "black", 5);

数组的值为“blackberry”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值