C小结【指针】

指针的含义

在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。

举个例子:可以形象的想象当你酒店住宿时,每个房子相当于内存,对应的的房间都有不同的门牌号,假设有个人登记了一间房间,门牌号是Px,通过门牌号可以找到房间的位置,假设房间号是x,x就是内存,Px就是地址。

指针变量

指针变量就是一个变量,它存储的内容是一个指针。如果用前面的例子,可以理解为指针变量就是一张房卡,房卡存储了房间号的信息。

在我们定义一个变量的时候,要确定它的类型。int x、char ch、float。。。。在定义指针变量时也是一样的,必须确定指针类型。int 变量的指针需要用 int 类型的指针存储,float 变量的指针需要用 float 类型的指针存储。就像你只能用酒店 A 的房卡存储酒店 A 中房间号的信息一样。

#include <stdio.h>
int main()
{
int a = 10;//在内存中开辟一块空间
int *p = &a;//这里我们对变量a,取出它的地址,可以使用&操作符。
//将a的地址存放在p变量中,p就是一个之指针变量。
return 0;
}

总之,指针就是变量,用来存放地址的变量,存放在指针里的值都被当做地址
(指针的大小在32位平台是4个字节,在64位平台是8个字节)
" & "和“ * ”都是右结合方向,且为逆运算

指针的类型

定义指针的格式为:type+* 指针名
例:char *pc = NULL;
int *pi = NULL;
short *ps = NULL;
long *pl = NULL;
float *pf = NULL;
double *pd = NULL;(NULL表示空指针)
(指针变量初始化时,不能使用0而是要使用NULL)

type* * +指针表示的含义是指针的类型,而* *是间接寻址符
指针运算符(间接寻址符):与&为逆运算,作用是通过操作对象的地址,获取存储的内容。例:x = &i,x 为 i 的地址,x 则为通过 i 的地址,获取 i 的内容

“&”和“* ”都是右结合的。假设有变量 x = 10,则&x 的含义是,先获取变量 x 的地址,再获取地址中的内容。因为“&”和“*”互为逆运算,所以 x = *&x。

指针的与整数的加减

指针与整数的加减运算时,表示指针向前或者向后移动,不同的类型对应的移动单元长度不同
定义三个变量,假设它们地址为连续的,分别为 4000、4004、4008 int x, y, z;定义一个指针,指向 x int *px = &x;

利用指针变量 px 加减整数,分别输出 x、y、z printf(“x = %d”, px); 因为 px 指向 x,所以px = x, px + 1,表示,向前移动一个单元(从 4000 到 4004) 这里要先(px + 1),再*(px + 1)获取内容,因为单目运算符“”优先级高于双目运算符“+” printf(“y = %d”, *(px + 1));
printf(“z = %d”, *(px + 2)),之前的博客有讲单目运算符和双目运算符。

总之,指针的类型决定了指针向前或者向后走了多大距离,指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)。 比如: char* 的指针解引用就只能访问一个字节,而 int* 的指针解引用

int main(){
	int a = 10;
	int* p1 = &a;
	char b = 'a';
	char*p2 = &b;

	printf("%p\n", p1);
	printf("%p\n", p1 + 1);
	printf("%p\n", p2);
	printf("%p\n", p2+1);


输出结果为:
在这里插入图片描述

可以看到p1+1比p1多了四个字节,这是因为指针变量的类型是int*,
p2+1比p2多了两个字节,因为指针变量的类型是char*。
指针是有类型的,指针的类型决定了指针加减整数的步长,指针解引用时的权限

指针和数组名

举个例子:

int main(){
	int a[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	printf("%p\n", &a[0]);
	printf("%p", a);
	system("pause");
	return 0;
}

运行结果为:

可以看到,数组名和数组首元素的地址是一样的,我们又知道内存在电脑存储的地址是连续的。
所以数组名表示的是数组首元素的地址。

字符指针

在指针类型中有一种char* 类型

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值