C语言指针

给大家分享一下我对指针的一些理解,见识比较狭隘,大家有更高的见解可以一起交流。下面来看一下我的理解,大家请忽略我的图画的比较丑,大家不要见怪,划重点,我的图画的很丑!!!

内存和地址

 

在讲指针之前我们先来把内存和地址的知识梳理一下。计算机何为内存,何为地址呢?很好理解,下面我给大家举一个小小的例子,我们可以把计算机的内存看成是一排房子,然后每个房子里都可以存放东西,也就是我们所说的数据了,那我们怎么来区分房子放的都是些啥呢,很简单啊,房间号啊,也就是地址了。不知大家理解了没有,下面给大家来个图例吧。

但是计算机的内存由数以万计的位组成,每个位可以容纳0/1,由于一个为能标识的值范围太有限,通常许多位组成一组合成一个单位,叫字节。一个字节包含8位 可以存储无符号值0 ~ 255,或者有符号数-128 ~127。为存储更大的值,通常把多个字节合在一起作为更大的内存单位。从而内存中的每个位置又一个第一无二的地址标识;内存中的每个位置都包含一个值。如:

所以硬件是通过地址来访问内存的位置。

以此类推那C语言就是通过指针来访问内存的(此时是编译器的虚拟内存地址)。


对于某个值我们可以如下声明:
int a;
a = 1;
此时变量a是一个整形,所以我们需要一个整形指针来指向它
int *p = &a; &是取地址运算符,声明一个整型类型的指针,并且指向a所在的内存单元。

假如a存放在内存的地址为0x1000 这个单元。此时指针变量指向这个单元0x1000
可以通过单目操作符 * 来访问指针内容的值 *p = 1;

所以可以总结出 当声明一个指针变量指向某个变量时候,此时p中存放的是一个地址值。可以通过单目操作符 * 来取得这个地址中所存放的内容。下图可以表示两者之间的关系:

未初始化的指针和非法指针

如:

int *a;
*a = 12;
这个声明创建一个名叫a的整型指针变量,赋值语句吧12存储在a所指向的内存位置。
但是a究竟指向哪里呢,声明这个变量但是未对它进行初始化,所有无法预知12这个值将会存储在什么地方。所以上面是赋值是非法的。

此时a中存放的地址为?????,而这个地址中存放的值也是未知的,所以这样赋值时非法的。

但是a如果存放的地址是合法的,此时就会造成把原来那个合法的地址值进行修改。所以在对指针进行间接访问之前,必须确保它已被初始化。

指针与数组的关系
当我们声明一个数组时。int a[7]; 此时声明一个数组长度为10的数组。而数组名的值是一个指针常量,指向第一个元素的地址。

大致上可以这么表示。a这个数组存放于0x1000开始的这个地址。

数组与指针的区别
当我们声明一个长度为10的数组时,编译器会为其分配好一块连续的内存来存放这组数据。如int a[10]. 此时编译器会为a这个数组分配长度为40个字节的内存。但是我们声明一个整型指针并指向数组时。int *p = a;
编译器只会为其分配4个字节的内存。指向a的首地址。
如int array[7];
int *ap = array + 2 ;

那这是什么意思呢?可以用下图表示

所以说有时候使用指针通常比使用下标效率更高

NULL指针
C语言标准中定义了一个NULL指针,为特殊的指针变量,表示不指向任何东西

指针常量
*100 = 25;
假如变量a存储于位置100,看上去像把25赋值给a,因为a是位置100存储的变量。但是这是错误的!。因为100的类型必须是整型,而间接访问操作只能作用于指针类型的表达式。可以如下:
*int( * )100 = 25;
强制类型转换把值100 从整型转换为 指向指针的指针。但是这种赋值是几乎不存在的,因为我们无法预知编译器会把某个特定的变量放在内存中的那个位置。


字符串常量
当一个字符串常量出现于表达式中,它的值是一个指针常量。编译器把这些指定字符的一份拷贝在内存的某个位置,并存储一个指向第一个字符的指针。

指针好处千万条,规范使用第一条,使用不规范,bug千千万。千万要避免野指针之类的错误。好了,以上就是我对指针的一些认识,见识比较鄙陋,请大佬赐教。大家千万不要在意我的图画的丑!!!
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值