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

(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博客

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

相关文章:

  • 【算法百题】专题七_分治快排_专题八_分治归并
  • (hash表+vector 数位和相等数对的最大和)leetcode 2342
  • 遥感数据处理
  • 七、面向对象高级_设计模式
  • Visual Studio里的“公共语言运行时支持”各选项的作用是什么,分别适用于哪些场景?
  • 宇树与智元的崛起:机器人“灵魂”注入的技术密码
  • Mock接口编写教程-axios-mock-adapter(React)
  • 神聖的綫性代數速成例題6. 方陣行列式的性質、伴隨矩陣
  • Python驱动CATIA自动化建模:科赫雪花算法实现与工程应用
  • AI数字人短视频数字人口播源码核心技术解析与商业应用
  • 使用usb-cam包时填充摄像头参数话题
  • 第27周JavaSpringboot git初识
  • 【商城实战(30)】从0到1搭建商城数据分析功能,开启数据驱动增长引擎
  • 数据可视化在特征分布对比中的应用
  • 【AI-Coding】聊聊AI--软件架构探索体验
  • Mysql - 日志相关问题
  • 【工具类】PDF文件转图片
  • 计算机网络 第一章:计算机网络和因特网(1)
  • CMake学习笔记(三):静态库,动态库的生成和使用
  • Python基础入门掌握(十三)
  • CMG亚太总站:没有邀请韩国偶像团体举办巡回演出
  • 《大风杀》上海首映,白客说拍这戏是从影以来的最大挑战
  • “网约摩托”在部分县城上线:起步价五六元,专家建议纳入监管
  • 王毅谈金砖国家开展斡旋调解的经验和独特优势
  • 人民日报评论员:因势利导对经济布局进行调整优化
  • 八成盈利,2024年沪市主板公司实现净利润4.35万亿元