C语言指针总结(第一结)

内存和地址
我们可以把计算机的内存看成一条长街上的一排房屋。每个房子都可以容纳数据,并可以通过房号来标识
在这里插入图片描述
但是计算机的内存由数以万计的位组成,每个位可以容纳0/1,由于一个为能标识的值范围太有限,通常许多位组成一组合成一个单位,叫字节。一个字节包含8位 可以存储无符号值0 ~ 255,或者有符号数-128 ~127。
为存储更大的值,通常把多个字节合在一起作为更大的内存单位。
从而内存中的每个位置又一个第一无二的地址标识;
内存中的每个位置都包含一个值。

在这里插入图片描述
所以我们硬件是通过地址来访问内存的位置。
但是C语言中可以通过指针来访问内存(此时是编译器虚拟的内存地址);
对于上述某个值我们可以如下声明:
int a;
a = 122;
此时变量a是一个整形,所以我们需要一个整形指针来指向它
int *p = &a; &是取地址运算符,声明一个整型类型的指针,并且指向a所在的内存单元。
在这里插入图片描述
假如a存放在内存的地址为ox1000 这个单元。此时指针变量指向这个单元ox1000
可以通过单目操作符 * 来访问指针内容的值 *p = 122;

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

未初始化和非法指针

int *a;
*a = 12;
这个声明创建一个名叫a的整型指针变量,赋值语句吧12存储在a所指向的内存位置。
但是a究竟指向哪里呢,声明这个变量但是未对它进行初始化,所有无法预知12这个值将会存储在什么地方。所以上面是赋值是非法的。
在这里插入图片描述
但是a如果存放的地址是合法的,此时就会造成把原来那个合法的地址值进行修改。所以在对指针进行间接访问之前,必须确保它已被初始化。

指针与数组的关系
当我们声明一个数组时。int a[10]; 此时声明一个数组长度为10的数组。而数组名的值是一个指针常量,指向第一个元素的地址。在这里插入图片描述
可以粗略的表示。假设a这个数组存放于ox100开始的这个地址。

数组与指针的区别。
当我们声明一个长度为10的数组时,编译器会为其分配好一块连续的内存来存放这组数据。如int a[10]. 此时编译器会为a这个数组分配长度为40个字节的内存。但是我们声明一个整型指针并指向数组时。int *p = a;
编译器只会为其分配4个字节的内存。指向a的首地址。
如int array[10];
int *ap = array + 2 ;
在这里插入图片描述
*ap:即为array[2];
ap[0] 此时是错误的 ap不是一个数组,只是一个指针
ap + 6 如果ap指向array[2] 此时 表达式相当于 array + 8 或者 &array[8];
*ap + 6 先执行间接操作符号 所以为 array[2] + 6
*(ap+6) 由上可以得到为 array[8]
&ap 合法表达式,但是无法预知ap存放在什么地址
ap[-1] 此时下标引用就是间接访问表达式。ap指向第三个元素 -1得到前一个元素 array[1];

有时候我们使用指针通常比下标更有效率;

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

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

“xyz” + 1;
这个表达式计算 "指针值加上1"的值,结果为一个指针 指向 y

*“xyz” :x

“xyz”[2] ?

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值