字符串数组和字符串指针(有关于指针的思考)

定义一个字符串数组

 

char str[10];

 

定义一个字符串指针变量

 

char * str;

 

前者是表示定义一个10个字符长度的数组,str表示该字符数组的首地址,这里的str是一个地址常量,不可以修改。

 

而后者定义一个字符型的指针变量str,这里的str是一个变量,一个用来存贮字符型数据单元的地址的一个变量,它是可以修改的。

 

对于一个指针变量,它首先也是一个变量,变量就是一个存储数据的单元,只是特殊的是,这里存贮的数据是一个地址。

 

那么针对char * str中的str表示的就是这个指针变量里面的内容(也就是一个地址值)。

 

比方说

 

我先定义一个字符变量 char s = 'a';

 

然后将str这个指针指向s变量,那么str里面存储的就是s的地址,那么*str表示的是什么?我理解为,这里的*号表示一种寻址的方式,

 

就像汇编语言中的间接寻址指令中用到的@符号。所以*str就是一种间接寻址,也就是说按照str里面的地址去找到那个变量,然后

 

获得找到的这个变量的值。既然是一个变量当然就可以对它执行某些操作,比如说加减,这是由意义的,应为地址的加减操作对应着

 

地址的量的偏移。而乘除法显然是没有意义的,所以不能对一个指针变量执行乘除操纵。

 

 

对于定义的字符数组char str[10]中的str来说,这里的str指的是这个数组的第一个元素的地址,是一个地址,也就是说一旦这个数组定义了

 

那么这就是一个确定的值了,没法改变的东西了,因此它是固定不变的,当然也不存在说对于一个地址常量的运算操作了。

 

 

这里想到了一个问题,唐浩强版的c程序设计一书中说到过一个例子,当时没完全明白,现在想想到是清楚一些了(第三版的P258)

 

中提到如下这样做事不正确的:

 

char * a;

scanf("%s" , a);

 

当时不理解,为什么这样是不安全的呢?scanf不是就是需要一个地址参数,a变量中就是用来存储变量的啊。

 

确实对于指针变量a,当中存储的确实是地址变量,但是当申明一个指针变量时,在编译的时候确实要给变量a分配内存单元,也就是说a这个

 

变量时占据了一定的空间块的。但是这个时候,a变量并没有初始化啊,也就是说它没有指向任何的地址单元,a当中的值是不可预料的。

 

所以说如果这个时候我们用scanf去将输入的数据存储,那么是存储到什么地方呢?

 

如果a当中的那个不可预知的值,恰好是一段空闲的内存单元,那也许会没问题,但如果这个未知的值是指向一块有用的内存呢,那样

 

就会破话其他的程序。我在用vc调试的时候是会出现内存不可写的错误的。可见这种做法确实不可取。

 

所以如果要实现上面的功能,那么就得将a指向一个确定的内存区域,比如说:

char * a;

char b[10];

a = b;

scanf("%s",a);

 

当然这个时候最好不要是的a的长度大于b数组的长度,应为一旦超出了对应的数组的长度,那么和上面的一样,也可能会覆盖其他

 

程序的内存区域啊,好无疑问,这个是危险的。

 

总结一下,指针也是一个变量,这个变量存储的是一类特殊的数据类型,存储单元的地址。

 

为什么c可以直接操作底层的硬件?就在于c的指针,应为我们可以得到存储单元的地址,就可以直接接触存储单元,这意味着什么呢?

 

呵呵,想想就知道了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hainan Chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值