C语言学习:指针

一、指针

地址和指针是计算机中两个重要的概念

程序运行过程中,变量或者程序代码被存储在以字节为单位组织的存储器。

如下所示:每个变量类型在内存单元中所占的字节大小不一样

#include<stdio.h>

int main()
{
    char a = 'a';
    printf("%d\n",sizeof(a));    //1
    
    int b = 1;
    printf("%d\n",sizeof(b));    //4

    double c = 2;
    printf("%d\n",sizeof(c));    //8
    
    float d = 3;
    printf("%d\n",sizeof(d));    //4

    return 0;

}

1、直接访问

以 int 类型为例,定义三个变量,int x=20 , y=100 , z=30

假设给x分配的地址为1000~1003,则y和z分别分到的地址为1004~1007和1008~1011

我们在使用 printf("%d\n",x);打印出x的数值,这种使用变量的方法叫做“直接访问”。

2、指针访问

通过对变量的地址进行操作。把专门用来存放变量地址的变量称为指针变量,简称指针。当一个指针变量的值是另一个变量的地址,就表示指针变量指向那个变量。

#include<stdio.h>

int main()
{
    int x = 10;
    int* p ;
    
    printf("x的地址为%p,x的值为%d\n",&x,x);
    printf("p的地址为%p\n",p);

    printf("========\n");

    p = &x;
    printf("%p\n",&x);
    printf("x的地址为%p,x的值为%d\n",&p,*p);
}

指针定义

#include<stdio.h>

int main()
{
    //定义一个指针
    //类型 * 指针变量名
    int *p ;
    int *a , *b ; //定义多个指针变量时,每个指针变量前都要加*

    //指针在使用前必须先赋值才可以使用,且被赋的值必须是地址
    // *p = 10;
    // printf("%d\n",*p);    //err
    //正确做法如下
    int i ;
    p = &i;
    *p = 10;
    printf("%d\n",*p);
    
    //野指针:指针变量指向一个未知的空间,操作野指针对应的内存空间可能会报错
    /*空指针:指针变量指向内存编号为0的空间 #define NULL ((void*)0) 操作空指针对应的内存空会报错
            在程序中用作条件判断*/
    //万能指针  void*   可以将所有指针类型赋值给万能指针,一般用作与函数形参
    //C语言中空指针不指向任何单元
    //指针的类型和它所指的变量的类型必须相同
    
    return 0;
}

指针大小

在32位操作系统,所有的指针类型都是4个字节大小

在64位操作系统,所有的指针类型都是8个字节大小

const修饰指针

#include<stdio.h>

int main0302()
{
    char str[] = "hello world";
    char ptr[] = "good boy";

    //常量指针
    //指针可以指向其他地址,指针指向的内容是不可改变的
    const char* p = str ;   //char const *p
    // *p = 'a'; //err
    // p[2] = 'a'; //err,同上
    p = ptr; //yes 

    printf("%s\n",p);

    return 0;
}

int main0303(void)
{
    char ktr[] = "I love you";
    char btr[] = "me too";

    //指针常量
    //指针指向的地址不可以改变,但内容可以修改
    char* const p = ktr ;
    // p = btr; //err
    // p[2] = 't'; //yes
    // *p = 't';    //yes
    printf ("%s\n",p);

}

指针和数组

#include<stdio.h>
int main()
{
    int arr[] = {1,2,3,4,5,6,7,8,9,10};

    //数组名是一个常量,不允许赋值
    //数组名是数组首元素地址
    //arr = 100; //err

    int* p ;
    p = arr;
    // printf("%p\n",p);
    // printf("%p\n",arr);
    *p = 123;
    
    // p++;
    // printf("%p\n",arr); //输出0061FEF4
    // printf("%p\n",p);   //输出0061FEF8

    for (int i = 0; i < 10; i++)
    {
        // * == [] ?
        // printf("%d\n",*(arr+i));    
        // printf("%d\n",arr[i]);   //err
        // printf("%d\n",p[i]);
        printf("%d\n",*p++);
        
    }
    printf("%p\n",arr); //输出0061FEF0
    printf("%p\n",p);   //输出0061FF18

}

多级指针

一级指针指向变量的地址

二级指针指向一级指针的地址

三级指针指向二级指针的地址

*三级指针 == 二级指针 == &一级指针

**三级指针 == *二级指针 == 一级指针 == &变量

***三级指针 == **二级指针 == *一级指针 == 变量

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值