C语言中关于指针与数组的总结

C语言中关于指针与数组的总结

知识点:
指针的本质, 数组的本质, 指针与数组的关系

敲黑板先看这里

你觉不觉得C语言基础知识概念在头脑里没有形成知识体系?是否比较模糊比较乱?这就对了?我之前也是,有些知识点时间长了容易忘或者混淆,有些初学者抓不住重点觉得C语言复杂,难!实不相瞒,我也是这样的感受,于是我想是时候整体的把C语言给好好的总结一下了,这样形成一个知识体系,就不容易忘,也不容易混淆,这就是这次总结的意义所在。
分为几个板块总结:数据类型、指针与数组、字符串、多维指针与多维数组、函数、内存分配与操作问题、符号总结、控制语句、以及编译方面的问题。
总结宗旨:绝不专牛角尖!主要围绕常用应用知识为主,突出重点,能够很好的形成知识架构。比如:总结了float一般就不会再总结double,这样做没有多大意义,相反的,把重要的拿出来好好分析一下,是很有意义的,而相似的东西就可以举一反三了。实际上就这些知识点,搞明白后,C语言就通透多了

指针

1.指针是C语言中一种特别的变量(就当成一般变量就行,不要复杂化),所保存的值是内存地址,可以通过指针修改内存中的任意地址内容;在指针声明时,*号表示所声明的变量为指针;使用时,*表示取指针所指向的内存空间的值。

2.当const出现在*号左边时指针所指的数据为常量,也就是说此时要求数据专一不变(用作修饰函数参数和字符串时居多);
当const出现在*号右边时指针本身为常量,也就是说此时指针专一指向一个地址 而不能指向其它地址(用来申请内存空间居多);

3.指针与整数运算:
指针是一种特殊的变量,与整数的运算规则为:
p + n; <–>(unsigend int)p + n*sizeof(*p); (指针地址值+偏移地址值)
意义:当指针p指向同类型的数组的元素时:p + 1将指向当前元素的下一个元素;p - 1将指向当前元素的上一个元素。

4.指针与指针运算:
指针之间只支持减法运算,参与减法运算的指针类型必须相同:
p1 - p2; <–> ((unsigend int)p1 - (unsigned int)p2)/sizeof(type);
意义:只有当两个指针指向同一个数组中的元素时,指针相减才有意义,其意义为指针所指元素的下标差;当两个指针指向不同数组时,结果未定义,无意义!

5.指针之间关系运算:
指针之间可以进行关系运算(<, <=, >, >=),关系运算的前提是同时指向同一个数组中的元素。任意两个指针之间的比较运算(==, !=)无限制;(与NULL比较居多)。

数组

1.数组是相同类型的变量的有序集合!如:int a[5];包含5个int类型的数据
其中:a代表数组第一个元素的起始地址,&a才是数组的地址,这20个字节空间的名字 为a;a[0],a[1]等都是a中的元素,并非元素的名字,数组中的元素没有名字。数组元素的个数可以显示指定:int a[5] = {1,2};也可以隐式指定:int b[] = {1,2};

2.数组名代表数组首元素的地址,数组的地址需要用取地址符才能得到;数组首元素的地址值与数组的地址值相同,但是数组首元素的地址与数组的地址是两个不同的概念。

3.数组名可以看作一个常量指针(注意:是看作!),指向的是内存中数组首元素的起始位置;但数组名不包含数组的 长度信息,在表达式中数组名只能作为右值使用,注意:在下面两种情况下数组名不能看作常量指针:
1).数组名作为sizeof操作符的参数时(此时为数组的大小不是常量指针的大小),
2).数组名作为&运算符的参数时(此时为数组的地址而不是常量指针的地址)

4.数组的本质是一段连续的内存空间,空间的大小为sizeof(数组的类型)*(数组长度)个字节;数组名可看作指向数组第一个元素的常量指针;

指针与数组的关系

1.数组声明时编译器自动分配一片连续的内存空间;指针声明时只分配了用于容纳地址值的4字节 空间;指针和整数可以进行运算,其结果为指针,指针之间只支持减法运算,其结果为数组元素下标差,指针之间支持比较运算,其类型必须相同。

2.数组名可以当指针使用,指针也可以当数组名使用: a[1]=2与*(a+1)=2; a[2]=3与*(a+2)=3;下标形式与指针形式的转换:
a[n] <–> *(a+n) <–> *(n+a) <–> n[a];

3.a为数组首元素的地址,&a为整个数组的地址,a与&a的区别在于指针运算:
a+1 --> (unsigned int)a + sizeof(a);
&a+1 --> (unsigend int)(&a)+ sizeof(
&a)–>(unsigned int)(&a) +sizeof(a);

4.数组作为函数参数时,编译器将其编译成对应的指针:
void f(int a[]); <–> void f(int* a); void f(int a[5]); <–> void f(int* a);
结论:一般情况下,当定义的函数中有数组参数时,需要定义另一个参数来表示数组的大小。

总结

以上总结以C语言知识框架为主线,着重强调实际经常应用!反复浏览体会可牢记,形成自己的知识框架,然后灵活应用,知识点来源于狄泰软件学习总结所得。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值