闲来无事,学学指针
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的值
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 的指针相对在设计层面弱化,让语法本身更简洁,操作更方便,更有利于一些服务端的开发。