当前位置: 首页 > article >正文

(C语言)指针与指针数组的使用教学(C语言基础教学)(指针教学)

指针是什么?指针怎么用?指针数组又是什么???

想必大家刚学C语言的时候对指针可谓是十分头疼了,听也听不懂,用也不会用

下面我来用我的理解来教你指针怎么用,还你一个脑子

1.指针的声明
声明指针时,需要指定它所指向的数据类型,并在变量名前加上*。
例如:
int *p;  // p 是一个指向 int 类型变量的指针

2.取地址运算符 &
& 用于获取变量的内存地址。
例如:
int a = 10;
int *p = &a;  // p 存储了变量 a 的地址
注:上面可以看到(a=10),这里是把a的地址传给p指针

细心的同学可能发现:诶?scanf函数不也是&这个符合吗?确实,其实scanf函数获得输入的地址来实现的

对于指针的声明其实还有个写法:

3.指针的另一种声明
例如:
int* p;

这个写法和上面的一样,但是可以更直观的看到,p就是指针!后续所有的p都是指针,*p是解引用,是p指针里面存储的内容

4. 解引用运算符 *
* 用于访问指针所指向地址的值。
例如:
int a = 10;
int *p = &a;
int b = *p;  // b 现在等于 10,因为 *p 访问了 p 所指向的 a 的值

第4个,所以这就是*p的作用。

5. 指针的初始化
指针在使用前应初始化,未初始化的指针可能指向无效地址,导致程序崩溃。
例如:
int *p = NULL;  // 初始化为 NULL,表示不指向任何地址

6. 指针的运算
指针可以进行加减运算,移动指向的内存地址。
例如:
int arr[3] = {10, 20, 30};
int *p = arr;  // p 指向数组的第一个元素
p++;  // p 现在指向数组的第二个元素

第5个的初始化,不仅仅是一个习惯,是必要,定义指针是一定要初始化的,不然有可能会发生不好的事情

对于第6个,指针只可以进行加减,加运算就是当前指针地址加一,减法同理,一定注意指针是不能乘除的!

7. 指针与数组
数组名本身就是一个指针,指向数组的第一个元素。
例如:
int arr[3] = {10, 20, 30};
int *p = arr;  // p 指向数组的第一个元素

8. 指针与函数
指针可以作为函数参数,传递变量的地址,以便在函数中修改原变量。
例如:
void increment(int *p) {
    (*p)++;  // 修改 p 所指向的变量的值
}

int main() {
    int a = 10;
    increment(&a);  // 传递 a 的地址
    printf("%d\n", a);  // 输出 11
    return 0;
}

9. 指针的指针
指针也可以指向另一个指针。
例如:
int a = 10;
int *p = &a;
int **pp = &p;  // pp 是一个指向指针 p 的指针

10. 动态内存分配
使用 malloc 和 free 进行动态内存分配和释放。
例如:
int *p = (int *)malloc(sizeof(int));  // 分配一个 int 大小的内存
*p = 10;
free(p);  // 释放内存

第7个,指针和指针数组几乎没有太大的差别,你就把指针看成一个空间块,里面可以存储一个数或者一堆数就行了

第8个注意,传递地址时,不要忘了&符号

第9个指针的指针也就是双重指针,就是定义一个大的白盒子把第一次定义的小黑盒子裹住一样,俄罗斯套娃,这个的应用就是在你使用指针时,想把这个指针一整个的运用才使用双重指针:

(C语言)给出一个区间,写出区间内所有的质数(指针数组解答)(双指针用法)-CSDN博客

在这条博客里,我使用了双指针,感兴趣的同学可以去看看

关于第10条动态分配,使用非常广泛,有数组的地方就有这个,搭配头文件stdlib.h使用分配malloc函数,或者使用重新分函数realloc函数,最后记得释放即可

(C语言)字符串反转函数(指针,递归解法)-CSDN博客

这篇博客,使用了malloc和realloc,其实,realloc更多的是防止垃圾值

说了这么多,有小伙伴可能还有点疑惑,那指针到底怎么用???

你只需要知道一点,使用指针的目的就是让局部变量成为全局变量,比如在main函数中a=10;我想在fun函数中也让a=10,怎么办?用指针,怎么用?先声明,然后传递地址就行,如:

#include <stdio.h>
//定义计算所需要的函数
void fun(int *size1,int *size2,int *size3){
    //确保输入的区间正确(例:用户输入9 3,给他改成3 9)
    //否则for不能运行
    if(*size1 >*size2){
        int *t=size1;
        size1=size2;
        size2=t;
    }
    //计算区间内每个数是否为c的倍数
    for(int i=*size1;i<*size2+1;i++){
        if (i%*size3==0){
            printf("%d是%d的倍数\n",i,*size3);
        }
    }
}
int main(){
    int a=0,b=0,c=0;
    printf("请输入一个区间:\n");
    //检验scanf是否合法;输入两个整数所以用2来判断
    if (scanf("%d %d",&a,&b)!=2){
        printf("输入的不是有效数字!");
        return 1;
    }
    printf("请输入倍数:\n");
    检验scanf是否合法;输入一个整数所以用1来判断
    if (scanf("%d",&c)!=1){
        printf("输入的不是有效数字!");
        return 1;
    }
    fun(&a,&b,&c);
    
    return 0;
}

对于博客: 

(C语言)定义一个区间输出该区间内为某个数的倍数的数(指针解法)-CSDN博客

本期博客就到这里,总结,指针就是让局部变量变成全局变量的方法

下面这篇博客,就用了局部变量变成全局变量才实现代码的!!

(C语言小项目)猜字游戏(正式版)_字谜游戏goc程序-CSDN博客

注:该代码是本人自己所写,可能不够好,不够简便,欢迎大家指出我的不足之处。如果遇见看不懂的地方,可以在评论区打出来,进行讨论,或者联系我。上述内容全是我自己理解的,如果你有别的想法,或者认为我的理解不对,欢迎指出!!!如果可以,可以点一个免费的赞支持一下吗?谢谢各位彦祖亦菲!!!!!


http://www.kler.cn/a/589647.html

相关文章:

  • Java中的消息中间件对比与解析:RocketMQ vs RabbitMQ
  • Matlab GPU加速技术
  • 蓝桥杯备赛(基础语法3)
  • 嵌入式八股,手撕线程池(C++)
  • vue3+Ts+elementPlus二次封装Table分页表格,表格内展示图片、switch开关、支持
  • 计算机图形学学习日志3
  • 数智读书笔记系列018 《多模态大模型:技术原理与实战》解锁多模态从原理到实战的深度探索
  • 3.14学习总结 排序算法
  • 高精度加法,高精度乘法,高精度除法,高精度减法,链表相加
  • 如何仅在conda中更新gcc版本
  • 什么是数学建模?数学建模是将实际问题转化为数学问题
  • Linux服务器跑python脚本定时任务
  • AIP-181 稳定级别
  • fastapi+angular实现个人博客
  • 什么是死锁?如何避免死锁?
  • 【spring boot 实现图片验证码 前后端】
  • ESP32学习 -从STM32工程架构进阶到ESP32架构
  • MySQL 性能优化:索引优化 + 读写分离 + Redis 缓存,TPS 提升 175% 实战解析
  • 《Classifier-Free Diffusion Guidance》的核心观点与方法
  • 三层架构与MVC架构的本质:从设计思想到实战选择