指针可以代替变量,不过初始化时不能直接赋值
include<stdio.h>
int main(void)
{
int *p;//int * 或者 int*(注意空格)这两种写法都一样,并且int和*是一个整体
//int *p=5;这是错误的
scanf("%d",&(*p));
//scnaf("%d",p);//其实p就是地址,这么写也是对的
printf("%d\n",*p);//其实在这里的 *就可以当做&符号的反操作(类似于+ -和 * /)&地址可以获取到变量的地址, *可以把地址当成变量
return 0;
}
地址:数据在内存中存放的位置对应的一个编号 注1:初学C语言的同学一般都是先学的printf,再学的scanf,这就导致一种先入为主的思想。printf输出里面直接是变量,而scanf里面要用&符号把变量变成地址,让很多人留下疑问。这其实要涉及到函数里面的传参问题了,在不利用地址进行传递(官方语言叫址传递,不利用地址传递的是值传递)的情况下,就相当于你给外地的人打了个电话,说了一些事,传递了一些信息,但是对方并不知道你在哪。这些事、信息就是变量里面的数值。但是,当发生火灾的时候呢,你打了119,但是说了半天起火原因,人员受伤情况,就是没有交代事发地点。显然这就不合适,消防员无法到指定地点进行作业。所以为了告诉计算机,到什么地方去做什么,就需要这种址传递了。计算机知道一个数据存储在什么地方,那么就可以更改它们(输入、修改、删除等操作)。
注2:在此对 * 进行一个解释。 * 在C语言里有3种常见的作用。
1. 乘法。不多说了,都知道的,从幼儿园就学了
2. 定义时用的:int* char*……表示后面加的变量是指针变量。
3. 放在地址前面,组合起来就相当于一个变量了
数组应该都学过,数组名是数组的首地址应该也知道
include<stdio.h>
int main(void)
{
int a[5]={1,2,3,4,5};
printf("%d",*a);//输出1。通过*可以把a这个地址里面的数据取出来,通过printf输出
return 0;
}
这里的a也是地址,但是与第一个程序里面的p有所区别。 p是一个指针(地址)变量,a是一个地址常量。一个字的区分,揭示了一个可以被更改,一个不可被更改。
include<stdio.h>
int main(void)
{
int a[5]={1,2,3,4,5};
int *p;
int b=6;
p=&b;
//a=&b;//这句就是错误的,常量时不能被赋值的。和不能为1赋值为2
printf("%d,%d",*a,*p);//可以把上一行的注释取消了试试
return 0;
}
对指针的应用,通常会和数组联系起来
include<stdio.h>
int main(void)
{
int a[5]={1,2,3,4,5};
int *p;
p=a;//因为a是地址,p是地址(指针)变量,所以p可以直接储存a
printf("%d",*p);//输出1
return 0;
}
还没完。。。
include<stdio.h>
int main(void)
{
int a[5]={6,7,8,9,10};
int *p=a;//因为(int *)是一个整体,所以这样写效果和上一个程序中分两行效果一样
for(;p<a+5;p++)//p++ == p=p+1; 对指针变量进行加一的操作,只是让指针所指向的东西发生改变,具体怎么改变的,先自己运行后猜一下
{
printf("%d",*p);
}
return 0;
}
揭幕:如果把数组当成盒子,a[5]就是一个内含5个小格的盒子,编号为1 2 3 4 5.数组名是首地址,也就是首个编号1.最开始让p=a,所以p就是1.然后循环里面又让p++,所以p就由6指向了7.如此一来,就成了一个动态。可以指向数组里面的任意一个数据,然后通过*取出来。
以上说的都是很简单的指针。理解了这些,就可以继续学习指针和函数了,指针通常都会用在传参的地方的。