指针
就是保存地址的变量
int i;
int* p=&i;//p是一个指针,*表示指针p指向的是一个int,把i的地址交给了p,p里面存放的是i的地址
int *p,q;
int* p,q;//这两行的写法意思是相同的,表示*p是一个指针,但是q只是一个普通的变量
指针变量
变量的值是内存的地址
普通的变量的值是实际的值
指针变量的值是具有实际值的变量的地址
指针和指针变量的区别
指针就是地址,地址就是指针;指针变量是一个变量,它保存了基本类型变量的地址。
如果指针变量p保存了变量a的地址,那么称作p指向了a,*p 就是变量a。
如果p是一个指针变量,*p 表示了以 p 的内容为地址的变量,就是p指向的变量。
#include<stdio.h>
void f(int *p);
int main()
{
int i=6;
printf("&i=%p\n",&i);
f(&i);
return 0;
}
void f(int *p){
printf("p=%p\n",p);
}
访问那个地址上的变量
*是一个单目运算符,用来访问指针的值所表示的地址上的变量
可以做左值也可以做右值
int k=*p;
int *p=k+1;
#include<stdio.h>
void f(int *p);
void g(int k);
int main()
{
int i=6;
printf("&i=%p\n",&i);
f(&i);
g(i);
return 0;
}
void f(int *p){
printf("p=%p\n",p);
printf("*p=%d\n",*p);
*p=26;
}
void g(int k){
printf("k=%d",k);
}
输出结果
//有一个房间,里面住了一个人,叫6,这件事情突然被p知道了,p很不高兴,因为p不喜欢6。于是,p就想,我里面住着的人叫70(假设为变量i的地址),这不就是6的地址吗。于是p取来了一把万能钥匙(*),我可以打开6的门,把6赶出去,把26换进来。
为什么编译器没有报错
int i=6;
scanf("%d",i);
你本来应该写&i是一个地址,但是你现在写成了i,编译器看不出来,编译器以为你传入的就是一个地址。虽然编译没有出错,但是运行一定会出错,因为它把你传入的变量传到了地址6里面去,而不是它原本该传入的地址。