初识指针,简单的理解

指针可以代替变量,不过初始化时不能直接赋值

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.如此一来,就成了一个动态。可以指向数组里面的任意一个数据,然后通过*取出来。

以上说的都是很简单的指针。理解了这些,就可以继续学习指针和函数了,指针通常都会用在传参的地方的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值