前言
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