指针:
- 指针就是地址,地址就是指针。
- 地址就是内存单元的编号。
- 指针变量是存放地址的变量(例:int* p,这里的p就是指针变量,用于存放地址)
指针和指针变量是两个不同的概念:平时也把指针变量间读为指针,也就是说下面示例代码中的p既是我们所说的指针,也是我们所说的指针变量。
例:
- 指针里面存放的是100:这句话中,指针就是地址
- 指针里面存放的是地址:这句话中,指针就是指针变量
为什么使用指针:
- 指针能直接访问硬件(OpenGL显卡绘图)
- 快速传递数据(指针表示地址:如change_numbers方法调用,调用方法change_numbers函数的时候传入值进去,无法改变main方法中变量的真实值,只有传入地址(也就是指针)才能真正改变main函数中的变量的值)
- 返回一个以上的值(返回一个数组或者结构体的指针)
- 表示复杂的数据结构
- 方便处理字符串
- 有点像面向对象
示例代码:
#include <stdio.h>
void pointertest();
void change_numbers(int a, int b);
void main()
{
int a = 100;
int b = 200;
change_numbers(a, b);//这里传的是int类型的变量值,操作的是change_numbers函数中卫形参开辟出来的地址,不能真实的改变main方法中的a,b的值。
printf("a = %d \nb = %d \n", a, b);
change_numbers2(&a, &b);//这样就是直接把a,b在main方法中开辟的地址传过去,是直接操作main函数中a,b所在的地址,能直接改变main函数中a,b的值。
int i = 10;
int* p; //指针的声明,这时候会开辟出一块内存,也就是一个地址,但是这块内存中没有存放东西(int*类型)
//C语言中没有String类型,可用指针返回一个字符串
char* h = "Hello World !";
printf("array : %s\n", h);
p = &i;//指针的初始化,为上面开辟出来的内存进行赋值,指向了i这个整数所在的地址
printf("*p = %d \n", *p);
*p = 100;//这里的p就是指针(int*类型)(其实它叫指针变量,只是平时我们 习惯性叫它指针),*p指的是p指向的地址中的值(int类型)
printf("更改*p的值!\n");
printf("*p = %d \n", *p);
printf("i = %d \n", i);
printf("修改i的值!\n");
i = 50;
printf("*p = %d \n", *p);
printf("i = %d \n", i);
}
void change_numbers(int a, int b)
{
int temp;
temp = a;
a = b;
b = temp;
}
void change_numbers2(int* a, int* b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
运行结果: