C语言零基础入门-14_指针

C生万物 ● 大道至简 ● 鲍鱼科技

对应的视屏链接:C语言零基础入门_哔哩哔哩_bilibili


目录

目标

一、指针概述

二、指针的四个概念

三、什么是地址

四、指针操作

五、指向的类型

六、指针应用

七、总结

八、作业


目标

  • 指针入门

  • 掌握指针的4个概念

  • 学会指针的基础应用

一、指针概述

指针号称C的灵魂,可见地位不一般,我也把指针和数组合并称为C的任督二脉,当能熟练掌握指针之际,便是C语言灵活应用之时。

二、指针的四个概念

1、指针的本质:地址

2、指针有两值:自身的值、指向的值

3、指针有两类型:自身的类型、指向的类型

4、指针的大小:4字节或8字节

三、什么是地址

地址就是内存单元的编号

四、指针操作

1、获取变量地址

#include<stdio.h>

int main()
{
    int a = 10;
    printf("a的值为:%d, a的地址为:0x%p\n", a, &a);
    return 0;
}

对变量取地址,通过&符号

2、指针的本质

//定义变量,本质是要开辟内存空间,只要开辟空间,就会有地址,那地址如何存储,就是使用指针变量
#include<stdio.h>
int main()
{
    int a = 10;
    
    int *p = &a; //p是指针变量,保存了a的地址

    return 0;
}

指针变量是保存指针的变量,而给p却赋值一个地址,从而推出,指针其实就是地址而已。

3、指针的大小

#include<stdio.h>
int main()
{
        printf("%d\n", sizeof(char*));
        printf("%d\n", sizeof(short*));
        printf("%d\n", sizeof(int*));
        printf("%d\n", sizeof(float*));
        printf("%d\n", sizeof(double*));
        return 0;
}

可以分别测试32位和64位的运行结果:4字节、8字节

4、指针的两值

#include<stdio.h>
int main()
{
        int a = 10;
        int b = 20;

        int *p = NULL;
        p = &a;

        *p = 100;   //修改指向的值
        p = &b;     //修改自身的值

        return 0;
}

 

p指针变量保存了a的地址,我们就形象认为p指向了a

此时对于p来说,有两方面的值,一是p变量自身的值,二是*p所指向的值(也称解引用)

对*p赋值,就是修改指向的值,即修改a的值

对p赋值,比如p=&b,就是修改p指针变量自身空间的值,即让p不再指向a,而是指向b

 

5、指针的两类型

  • 自身的类型

char *pc; //把名字pc去掉,剩下的char*就是pc指针变量自身的类型,即字符指针类型

short *ps; //把名字ps去掉,剩下的short*就是ps指针变量自身的类型,即短整型指针类型

int *pi;      //把名字pi去掉,剩下的int*就是pi指针变量自身的类型,即整形指针类型

double *pd; //把名字pd去掉,剩下的double*就是pd指针变量自身的类型,即浮点指针类型

//总结:当能够定义出指针变量的时候,只需把名字去掉,剩下的就是指针变量自身的类型

  • 指向的类型

char *pc; //把名字pc和*去掉,剩下的char就是pc指针变量指向的类型,即字符类型

short *ps; //把名字ps和*去掉,剩下的short就是ps指针变量指向的类型,即短整型类型

int *pi;     //把名字pi和*去掉,剩下的int就是pi指针变量指向的类型,即整形类型

double *pd; //把名字pd和*去掉,剩下的double就是pd指针变量指向的类型,即浮点类型

//总结:当能够定义出指针变量的时候,把名字和*去掉,剩下的就是指针变量指向的类型

五、指向的类型

对指针而言,指向的类型是很重要的一个指标

1、决定了指针所能操作的内存范围

#include<stdio.h>

int main()
{
        int a = 0x11223344;

        char *pc = (char*)&a;
        short *ps = (short*)&a;
        int *pi = &a;

        printf("0x%x\n", *pc);
        printf("0x%x\n", *ps);
        printf("0x%x\n", *pi);

        return 0;
}

运行结果:
0x44
0x3344
0x11223344

2、决定了指针+1的能力(即指针+1,到底加几个字节)

#include<stdio.h>

int main()
{
        int a = 0x11223344;

        char *pc = (char*)&a;
        short *ps = (short*)&a;
        int *pi = &a;

        printf("0x%p : 0x%p\n", pc, pc+1);
        printf("0x%p : 0x%p\n", ps, ps+1);
        printf("0x%p : 0x%p\n", pi, pi+1);

        return 0;
}

运行结果:
0x00BDF9DC : 0x00BDF9DD     加了1个字节
0x00BDF9DC : 0x00BDF9DE     加了2个字节
0x00BDF9DC : 0x00BDF9E0     加了4个字节

六、指针应用

  • 操作数组

#include <stdio.h>

int main()
{
        int ar[] = {1,2,3,4,5,6,7,8,9,10};
        int n = sizeof(ar) / sizeof(ar[0]);

        //数组名访问
        for(int i=0; i<n; ++i)
                printf("%d ", ar[i]);
        printf("\n");

        //指针访问
        int *ptr = ar;
        for(int i=0; i<n; ++i)
                printf("%d ", *(ptr+i));
        printf("\n");

        return 0;
}
  • 交换两数

#include <stdio.h>

int Swap(int *a, int *b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}
int main()
{
    int a = 10;
    int b = 20;
    printf("a = %d, b = %d\n", a, b);
    Swap(&a, &b);
    printf("a = %d, b = %d\n", a, b);
    return 0;
}
  • 函数的出参

#include <stdio.h>

//v参数就是出参,目的是为了把结果携带出来
void Sum(int a, int b, int *v)
{
    *v = a + b;
}
int main()
{
    int a = 10, b = 20;
    int result = 0;
    Sum(a, b, &result);

    printf("%d + %d = %d\n", a, b, result);
    return 0;
}

七、总结

指针是一把双刃剑,不能害怕,反而要利用好锋利的一面

八、作业

CC4 利用指针遍历数组

#include<stdio.h>

int main() 
{
    int ar[6];
    for(int i=0; i<6; ++i)
        scanf("%d", &ar[i]);

    int *ptr = ar;
    for(int i=0; i<6; ++i)
        printf("%d ", *(ptr+i));
    return 0;
}

CC5 牛牛的新数组求和

#include <stdio.h>

int cal(int *ar, int n)
{
    int sum = 0;
    for(int i=0; i<n; ++i)
        sum += *(ar+i);
    return sum;
}

int main() 
{
    int n;
    scanf("%d", &n);
    int ar[n];
    for(int i=0; i<n; ++i)
        scanf("%d", &ar[i]);
    
    int sum = cal(ar, n);
    printf("%d", sum);
    return 0;
}

CC6 牛牛的排序

#include <stdio.h>

void sort(int *ar, int n)
{
    for(int i=0; i<n-1; ++i)
    {
        for(int j=0; j<n-1-i; ++j)
        {
            if(ar[j] > ar[j+1])
            {
                int tmp = ar[j];
                ar[j] = ar[j+1];
                ar[j+1] = tmp;
            }
        }
    }
}

int main() 
{
    int n;
    scanf("%d", &n);
    int ar[n];
    for(int i=0; i<n; ++i)
        scanf("%d", &ar[i]);
    
    sort(ar, n);

    for(int i=0; i<n; ++i)
        printf("%d ", ar[i]);
    return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值