再论C语言中的指针和数组
来源:互联网 发布:淘宝查询信誉网站 编辑:程序博客网 时间:2024/04/30 03:35
之前指针与数组的总结性的小文已经整理过多次了,自我自己的使用只是范畴中基本上够用了。不过,今天看书的时候发现有一个知识点遗漏,这里做一下补充。
遗漏的知识点是关于数组名称所等同的指针的具体数据类型问题。其实,大多数能够找到的教程或者是文章基本上会总结到除了用于sizeof的参数,其他时候数组的名称基本上与指向数组元素的首元素的指针等同。不过,这个等效指针如果看做指针的话应该是一个什么数据类型呢?
关于上面的问题,其实看过map或者elf文件,联想一下其中的信息基本上也可以得出答案。数组名对应的地址是固定不变的,在链接之后就有了固定的地址。既然有了固定的地址,那么考虑到指针或者地址的使用时就应该注意到,这个量应该是只能够读取但是不能够修改的。
写一段代码如下:
#include"stdio.h"
int a[] ={1,2,3,4,5};
unsigned char b[]= {1,2,3,4,5};
int main(void)
{
a++;
return 0;
}
代码编译结果:
E:\WorkSpace\01_编程语言\01_C语言\exp_05>gcc exp_05.c
exp_05.c: Infunction 'main':
exp_05.c:8:3:error: lvalue required as increment operand
a++;
^
虽然没有提示对常量进行赋值,但是提示出了如此修改是非法的。其实,便于理解,这种类似的现象我们可以理解为数组的名称是一个指针常量。
代码修改,做一点其他的验证测试:
#include"stdio.h"
int a[] ={1,2,3,4,5};
unsigned char b[]= {'1','2','3','4','5'};
int main(void)
{
printf("value of a element:%d\n",*a);
printf("value of b element:%c\n",*b);
printf("value of a element:%d\n",*(a + 1));
printf("value of b element:%c\n",*(b + 1));
return 0;
}
代码编译运行结果:
E:\WorkSpace\01_编程语言\01_C语言\exp_05>gcc exp_05.c
E:\WorkSpace\01_编程语言\01_C语言\exp_05>a
value of aelement: 1
value of belement: 1
value of aelement: 2
value of belement: 2
这里其实能够得出一个结论:作为指针的偏移增加或者指针变量的修改,变化值并一定是字节数乘以偏移量或者是整型大小乘以偏移量。指针指向地址的变化实际上是指针指向类型大小乘以偏移量。这是很“聪明”的一种处理,让我们少了很多判断的麻烦。尤其是当我们面临复杂的数据结构时,我们的思维可以放在数据对象本身上面而少一点考虑计算机存储的模型。
- 再论C语言中的指针和数组
- c语言中的数组和指针
- c语言中的数组和指针
- c语言中的指针和数组
- 小议C语言中的数组和指针
- C语言中的指针和数组
- C语言中的指针数组和数组指针
- C语言中的指针数组和数组指针
- C语言中的指针数组和数组指针
- C 语言中的数组类型和数组指针类型.
- C语言中的数组指针
- C语言中的指针数组
- c语言中的指针数组
- C语言指针数组和数组指针
- C语言指针数组和数组指针
- C语言指针数组和数组指针
- C语言指针数组和数组指针
- C语言指针数组和数组指针
- Git的一点简单命令及文档
- ButterKnife源码分析(二)
- python脚本内运行linux命令的方法
- JavaIO流基础之文件读写
- 神经网络与深度学习(2):梯度下降算法和随机梯度下降算法
- 再论C语言中的指针和数组
- Centos安装Django并创建项目
- 【数学】一个奇技淫巧:如果用一枚硬币生成任意概率——比如1/π?
- # Android文件存储和数据库基本知识
- 博客笔记图片
- bitset关于二进制运算
- 最长上升子序列的变化
- JS原生轮播图代码
- 雅可比矩阵 和 海森矩阵