C语言 指针


前言

C语言是最接近计算机底层的高级语言之一,它能够直接操作内存,C语言的指针为程序员提供了更多的操作,但也有陷阱


一、指针是什么?

指针就是内存地址!,指针变量就是存放这个内存地址的变量!

二、声明一个指针

1.声明

代码如下:

type* pointer_name;

type是类型名称,比如int,char,float…等等
pointer_name是指针变量的名字,和普通变量一样也是要取名的

2.指针的使用

开头已经讲到,指针是存储内存地址的。
你或许使用过scanf函数
假定有以下代码

#include <stdio.h>
#include <stdlib.h>
int main() {
	int a;
	scanf("%d", &a);
	printf("a:%d", a);
	return 0;
}

很简单的一段代码,输入一个数,打印这个数。
scanf函数里面为什么是&a而不是a?那是因为函数传普通变量是会被拷贝的,必须用它的地址才能够完成赋值,我另一篇文章有讲。
那么,我们打印&a,会出现什么呢?
代码如下:

#include <stdio.h>
#include <stdlib.h>
int main() {
	int a;
	printf("%p", &a);
	return 0;
}

%p格式打印一串地址
输出结果

000000310691FB44

注意,内存是随机分配的,打印结果是不一样的,但是这么长就对了。
我们已经可以打印&a了
我们可以用指针变量保存&a

#include <stdio.h>
#include <stdlib.h>
int main() {
	int a;
	int* p = &a;
	printf("%p\r\n",&a);
	printf("%p", p);
	return 0;
}

p是一个指针变量,它是int*类型,xxx*类型就代表是xxx类型的指针
比如这里是int*。
我们可以对一段地址进行取值操作

#include <stdio.h>
#include <stdlib.h>
int main() {
	int a = 20;
	printf("%d\r\n", *(&a));
	return 0;
}

输出结果:20
&a是a的地址,*可以取该地址的值,为20
同样,取出这个值是可以更改的

#include <stdio.h>
#include <stdlib.h>
int main() {
	int a = 20;
	*(&a) = 100;// 等价于 a = 100
	printf("%d\r\n", a);
	return 0;
}

输出结果:100
刚刚我们可以使用指针保存变量a的内存地址,通过上面这个例子,我们也可以使用指针更改变量a的数值。

#include <stdio.h>
#include <stdlib.h>
int main() {
	int a = 20;
	int* p = &a;
	*p = 200;
	printf("%d\r\n", a);
	return 0;
}

输出结果:200

3.为什么要使用指针

#include <stdio.h>
#include <stdlib.h>
void addOne(int value) {
	value++;
}
int main() {
	int a = 20;
	addOne(a);
	printf("%d", a);
	return 0;
}

addOne函数是无效的,打印结果仍然为20。因为变量进入函数总是进行拷贝,但是我们可以传入指针更改指向内存所存储的值达到效果。

#include <stdio.h>
#include <stdlib.h>
void addOne(int* value) {
	(*value)++;
}
int main() {
	int a = 20;
	addOne(&a);
	printf("%d", a);
	return 0;
}

打印结果:21

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值