总结起来:指针是c语言的灵魂
int * p; // p是一个变量名,p变量的数据类型是int *,所谓int *类型,就是存放了int类型的地址信息
int i = 3;
p = &i; //p保存了i的地址,*p就完全等同于i,*p:以p的内容为地址的变量
# include
int main(void)
{
int * p;
int i = 5;
*p = i;
printf("%d\n", *p);
return 0;
}
上述代码运行,程序就会崩溃!
当我们定义了int * p 之后,并没有给它进行初始化,因此p指向的是一个未知的一块内存空间,操作系统并没有给权限让我们去进行访问,此时将i的值赋值给*p,会出错
交换数字的例子
#include
void swap_3(int * i, int * j) {
int t;
t = *i;
*i = *j;
*j = t;
}
void swap_2(int * i, int * j) {
int * t;
t = i;
i = j;
j = t;
printf("i = %d, j = %d\n", i, j);
}
void swap_1(int i, int j) {
int t;
t = i;
i = j;
j = t;
}
int main(void) {
int a = 3;
int b = 5;
printf("a = %d, b = %d\n", a, b);
printf("&a = %d, &b = %d\n", &a, &b);
//swap_1(a, b); //实参和形参永远不同,传过去之后仅仅互换了形参,并没有换实参
//swap_2(&a, &b); //仅仅改变了函数方法中i,j内部的地址,对主调函数没有任何影响
swap_3(&a, &b); //成功互换,因为此时通过指针直接对a,b中存储的存储的数据进行了互换
printf("a = %d, b = %d\n", a, b);
return 0;
}
如果不通过指针,实参传值给形参,是无法再函数中对多个值进行更改的,因为实参和形参在内存中有各自的存储区域,互不干扰,但是当用指针之后,我们可以直接在被调函数中对主调函数的值进行更改,实现一个被调函数改变主调函数中多个值
没有对指针进行初始化,却试图去使用它指向的内存空间
#include
int main(void) {
int * p; //没有对指针进行初始化
int i = 5;
*p = i; //p指向一块未知的内存空间,没有权限去访问和调用它,执行到这局就报错
return 0;
}
#include
int main(void) {
int i = 5;
int * p;
int * q;
p = &i;
printf("*p = %d\n", *p);
p = q; // 运行到这里就会报错
printf("*p = %d\n", *p);
return 0;
/*
p的对象进行了一次初始化,指向了i所在的内存空间,q对象没有初始化,因此内部存的是垃圾值
将q赋值给p之后,是将q内部地址赋值给了p此时p也指向了一块没有分配给本程序的空间,此时
对*p操作就会出错
*/
}