指针的简单使用

昨天学习队列运行Demo的时候遇到了一个小问题,就是声明队列指针的时候,忘记给指针赋值。导致运行了好几次都没啥反应。下面是我的错误代码:

#include "stdio.h"
#include "CirQueue.c"

int main(){

    CirQueue *Q;
    InitQueue(Q); 
    
    return 0;
}

平常写的java,几天不用c,都忘记怎么使用了,今天还是决定再来复习一下指针,顺便记录下。

一、什么是指针?

指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。

就像其他变量或常量一样,在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为:
type var-name;
type:是c语言中的数据类型。
* : 是声明指针的标志。*后面的变量会被声明为指针类型
var-name:指针变量名称。

例如:

    int a,*b,c;
    double *x;

上面声明了三个int类型的变量和一个double类型变量。其中b和x前面有 * 修饰则表示为 int 类型指针变量和double 类型指针变量。

指针的值的实际数据类型是一个代表内存地址的长的十六进制数。

二、如何使用指针

1.定义一个指针变量、
2. 把变量地址赋值给指针、
3. 访问指针变量中可用地址的值

例子:

int main(){

    int a,*b; //声明变量
    a = 10;
    b = &a;     //使用&符号获取变量的内存地址,赋值给b
    *b = 100;   //使用*符号获得a的值并修改
    printf("a = %d\n",a); //%d替换a的值

    return 0;
}

上面例子运行结果:

a = 100

上面就是一组使用指针来获取并修改值得例子。

C中的NULL指针
int main(){

    int *c = NULL;

    printf("c的地址是:%p\n",c);//使用%p来替换指针c
    return 0;
}

运行结果:

c的地址是:0000000000000000

可以看出NULL 指针是一个定义在标准库中的值为0的常量。内存地址 0 有特别重要的意义,它表明该指针不指向一个可访问的内存位置。
但按照惯例,如果指针包含空值(零值),则假定它不指向任何东西。

所有指针在创建时都要初始化,如果不知道他指向什么就将 0 赋值给他。必须初始化指针,没有被初始化的指针被称为失控指针(野指针)。

三、指针的算术运算

递增运算
int main(){

    int *c;
    int arr[] ={10,20,30};
    c = arr;
    printf("c的地址是:%p\n",c);
    for (int i = 0; i < 3; i++)
    {
        printf("存储地址:arr[%d] = %p\n",i,c);
        printf("存储值: arr[%d] = %d\n",i,*c);

        c++;    //移动到下一个指针
    }
    return 0;
}

运行结果如下:

c的地址是:000000000061FE08
存储地址:arr[0] = 000000000061FE08
存储值: arr[0] = 10
存储地址:arr[1] = 000000000061FE0C
存储值: arr[1] = 20
存储地址:arr[2] = 000000000061FE10
存储值: arr[2] = 30

可以看出c的地址也就是数组arr的地址等于arr[0]。
arr[0],arr[1],arr[2]地址间隔4个字节,因为在当前运行环境下,一个整数占4个字节。所以每移动一个位置,内存地址就会增加4个字节。

递减运算
int main(){

    int *c;
    int arr[] ={10,20,30};
    c = &arr[2];
    printf("c的地址是:%p\n",c);
    for (int i = 2; i >= 0; i--)
    {
        printf("存储地址:arr[%d] = %p\n",i,c);
        printf("存储值: arr[%d] = %d\n",i,*c);

        c--;    //移动到下一个指针
    }
    return 0;
}

运行结果如下:

c的地址是:000000000061FE10
存储地址:arr[2] = 000000000061FE10
存储值: arr[2] = 30
存储地址:arr[1] = 000000000061FE0C
存储值: arr[1] = 20
存储地址:arr[0] = 000000000061FE08
存储值: arr[0] = 10
比较运算

已经赋值的指针的值是某一对象的内存地址,是一个16位长度的的十六进制数,所以可以进行大小的比较。
我们可以将上面的例子修改一下:

int main(){

    int *c;
    int arr[] ={10,20,30};
    c = &arr[2];
    printf("c的地址是:%p\n",c);
    int i=2;
    while (c>=arr)
    {
        printf("存储地址:arr[%d] = %p\n",i,c);
        printf("存储值: arr[%d] = %d\n",i,*c);

        c--;    //移动到下一个指针
        i--;
    }
    return 0;
}

运行结果:

c的地址是:000000000061FE10
存储地址:arr[2] = 000000000061FE10
存储值: arr[2] = 30
存储地址:arr[1] = 000000000061FE0C
存储值: arr[1] = 20
存储地址:arr[0] = 000000000061FE08
存储值: arr[0] = 10

当c的地址大于等于arr的地址时候,做递减运算。

指针的简单实用就介绍这么多了(目前只会这么多…),等后面遇到其他的问题在加上吧。

参考:菜鸟教程-c语言教程

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值