【杂谈】浅浅地学学C语言指针

闲来无事,学学指针

0. 前言

炎热的午后,不想写Java,这准备11月软考嘛,于是随手就抓一本教材来看:好家伙,C语言。

自从干了Java之后,C语言就少接触很多了,但是对比Java和C,总感觉少了些什么。这时,我想起昨天隔壁老王家的狗旺财又去做了绝育,看它回来智慧的眼神,好像感觉自己少了些什么重要的东西…
请添加图片描述

是的,Java比起C确实好像少了指针!很重要的东西。

但其实呢,Java其实也有指针,毕竟指针是不能少的东西,不能说我们平时写Java从来没进行过指针运算,就说它是母的。关于Java的指针,参考文章:
51CTO-Java的指针:https://blog.51cto.com/u_12831/6517911

学习参考文章,自己随便写了个demo:

public static void main(String[] args) {
        Animal a = new Animal();
        System.out.println(a);
}

// 输出
packages.Animal@16f65612

勉强认为这个输出就是这个对象的地址吧。其实是hashcode,只不过Java内部帮我们简化了指针,变成了这种形式。毕竟源码是这样的:

public String toString() {
        return this.getClass().getName() + "@" + Integer.toHexString(this.hashCode());
}

哎等等,好像有点跑题了,咱今天主要学的是C语言不是么,但气氛都到这了,不如今天就学C语言的指针吧!

以上逻辑不通的废话连篇,以下才是正文开始!

参考教程源
CSDN-英雄哪里出来:https://blog.csdn.net/WhereIsHeroFrom?type=lately

1. C语言指针

指针的概念其实我们不陌生,在学校学习《计算机组成原理》的时候就接触过指针的概念:指针即地址。咱们的计算机获取存储器里的数据时,就需要通过寻址(寻找地址)的方式获取。而在高级语言中,地址又叫指针。这就好比“鸡”既叫做“鸡”,又叫做“坤坤”。
坤坤

在C语言中,每个变量都有一个地址,通过这个地址我们可以寻找到该变量。而这个地址的值,可以通过指针变量来存放。

1.1 定义指针

语法格式

类型 * 变量名

注意,这里的*作用于变量声明,代表这是个指针变量,并不代表乘法的意思!

举例

#include<stdio.h>
int main(){
    int a;
    // 指针变量 p 指向 a, p 是 a 的指针, p 的值等于 a 的地址
    int *p = &a;
    // 输出 a 是否 等于 *p true or false
    printf("%d\n", a == *p);
    return 0;
}

1.2 解引用

C语言中,指针解引用是指通过指针访问其所指向的内存地址处存储的值。
还是使用*来访问指针指向的值,只不过,这次方向变了:

#include <stdio.h>
 int main() {
    int num = 10;
     // 指针ptr指向变量num的内存地址
    int* ptr = &num;  
     // 使用指针解引用操作符获取num的值
     printf("num的值为:%d\n", *ptr);  
     // 修改num的值
     *ptr = 20;  
     printf("修改后的num的值为:%d\n", *ptr);
     // ptr 的值是 num 的内存地址
     printf("ptr的值是 %d\n", ptr);
     return 0;
}

从上面的例子,也说明了解引用操作与指针变量值的区别,一个是操作符*解引用,另一个是指针变量实际的值。

1.3 数组的指针

有了以上指针的概念,结合我们上学时学过的数组知识,我们知道:数组的地址是连续的,数组的第一个元素的地址可以用数组名来表示,因此,对于数组的指针:

#include<stdio.h>
int main(){
    // 演示数组的指针
    int arr[5] = {1, 6, 3, 4, 5};
    // 定义一个指针变量
    int* ptr = arr;
    // 输出数组的第一个元素
    printf("数组的第一个元素为:%d\n", *ptr);
    // 输出数组的第二个元素
    printf("数组的第二个元素为:%d\n", *(ptr + 1));
}

2. C语言指针应用场景

对于个人而言,学习C语言指针主要用于:

  • LeetCode 刷题
  • 软考等考试
  • 拓展知识面

而在GPT的回答中,C语言的指针:

  • 动态内存分配:使用指针可以在运行时动态地分配内存。通过调用 malloc() 、 calloc() 或 realloc() 函数,可以在堆上分配内存,并使用指针来访问和管理这些内存块。
  • 数组操作:指针在C语言中广泛用于数组的操作。指针可以用来遍历数组元素、进行数组元素的读取和修改,以及进行动态数组的创建和释放。
  • 字符串处理:C语言中的字符串实际上是以字符数组的形式存在的。指针可以用来处理和操作字符串,例如查找字符串中的特定字符、拷贝字符串、连接字符串等。
  • 函数传递参数:指针可以作为函数的参数传递,通过传递指针可以在函数内部对变量进行修改,实现对变量的引用传递。
  • 数据结构:指针在实现各种数据结构(如链表、树、图等)时非常有用。通过使用指针,可以在数据结构中连接不同的节点或元素,实现灵活的数据操作。
  • 文件操作:指针在C语言中用于进行文件的读写操作。通过使用 FILE 指针,可以打开文件、读取文件内容、写入文件等。

举例

#include<stdio.h>
int main(){
    // 演示malloc函数
    int* ptr = (int*)malloc(sizeof(int));
    *ptr = 10;
    printf("ptr的值为:%d\n", *ptr);
    free(ptr);

    // malloc函数分配数组
    int* ptr2 = (int*)malloc(5 * sizeof(int));
    for(int i = 0; i < 5; i++){
        ptr2[i] = i + 1;
    }
    for(int i = 0; i < 5; i++){
        printf("ptr2[%d]的值为:%d\n", i, ptr2[i]);
    }
    free(ptr2);
    return 0;
}

3. 总结

本文通过学习C语言的指针,又成功水了一篇文章。

哈哈哈以上纯属玩笑。其实,在学习了一门语言后,再去学习一些其他语言,可以了解到不同语言的一些特性,例如,通过本次指针的学习或回顾,我们可以对比进一步思考:C语言指针的存在使我们与硬件的交互相对更直接,明朗一些。通过看更多的拓展资料,我们发现,当我们使用C语言的指针动态分配内存时,还要考虑使用完毕后的资源释放。而 Java 的指针相对在设计层面弱化,让语法本身更简洁,操作更方便,更有利于一些服务端的开发。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值