C语言中为什么要使用指针

2023年5月19日12:06:11

1、问:什么是指针?
(1)“指针”是一种数据类型,或者说一系列数据类型的泛指(包括int* float*等)
(2)也有很多时候,说起“指针”,指的是“指针变量”,其存储的是值的地址
所以看到相关描述存在差异时,不要诧异

为了避免文字描述的歧义,直接看代码:

int* p1;

(3)上述声明创建了一个“指针”p1 (指的是“指针变量”p1)
(4)int* 是一种类型——指向int的“指针” (指的是数据类型) ——c++ primer

再解释一个疑问,直接看代码:

 int* p1, p2; //标记为情况1,供下文使用

上述声明实际上创建了一个整型指针p1,一个整型变量p2,故而有人认为这是支持“指针不是数据类型”这一观点的理由,否则就应该是创建了p1和p2两个指针,而实际上并不足以成为理由。
(5)c++primer在解释了

 int* p1; //风格1
 int *p1; //风格2

这两种风格都可以,只是侧重点不同后,特地提及上述代码( 情况1),说明只是需要注意情况1,但是情况1并不能成为“指针不是数据类型”这一观点的理由
(6)并紧随其后有下面一句话:在C++中,int*是一种复合类型,是指向int的指针 ——c++ primer

2、问:指针是地址吗?
不论从上述的哪两个说法出发这一描述都是有问题的,这一描述应该仅仅是为了强调指针和地址密不可分的关系

3、问:C语言为什么要“引入指针”
这个说法本身存在问题,但是考虑到很多非计算机专业的可能存在类似问题,就以引号的形式提出这个问题。

(1)为什么说这个说法有问题?指针本身就是内存地址的抽象化,内存地址本身是计算机不可避免的,这也是有的人强调“指针天然存在”、“指针就是内存地址”的原因,这揭示了指针的本质,当然严格从语言规范来说,这一描述有问题。
(2)因此不是c语言引入了指针,而是常见的高级语言都隐藏了指针,以降低编程难度。同时牺牲了部分高性能运算能力。

4、为什么要用指针?
(1)指针的使用使得不同区域的代码可以轻易的共享内存数据
当然也可以通过数据的复制达到相同的效果,但是这样往往效率不太好。指针节省内存主要体现在参数传递上,比如传递一个结构体指针变量和传递一个结构体变量,结构体占用内存越大,传递指针变量越节省内存的,也就是可以减少不必要的数据复制。

(2)C语言中一些复杂的数据结构往往需要使用指针来构建,如链表、二叉树等。

(3)有些操作必须使用指针完成
①如:操作申请的堆内存。
②又如:C语言中的一切函数调用中,值传递都是“按值传递”的。如果要在函数中修改被传递过来的对象,就必须通过这个对象的指针来完成。(如对一个函数传入一个x一个y,交换两者的值,如果只是按值传递,那在函数内交换并不影响函数外的x和y,而指针则可以做到)

(4)动态分配内存
大多数情况下,可以看到程序使用的内存是通过显式声明分配给变量的内存(也就是静态内存分配)。这一点对于节省计算机内存是有帮助的,因为计算机可以提前为需要的变量分配内存。但是在很多应用场合中,可能程序运行时不清楚到底需要多少内存,这时候可以使用指针,让程序在运行时获得新的内存空间(实际上应该就是动态内存分配),并让指针指向这一内存更为方便。

(5)函数多个返回值
可以用指针(或者结构体?)

(6)指针和数组的效率问题(不太清楚缘由)
需要遍历数组或频繁引用其元素时, 这样效率比使用下标高.

5、指针和new
(1)new跟指针没有关系。
new是在堆上分配内存,作用域由开发人员确定。
不new是在栈上分配内存(全局变量、静态变量除外),作用域由变量作用域确定。
(2)创建指针要指向一块内存

int a;
int *p;
p = &a;

如果没有可以指向的内存,自然就需要new了

int* p = new int;

  • 作者:Cloudkip
  • 原文链接:https://blog.csdn.net/oyt1999/article/details/104423463
    更新时间:2023年5月19日12:06:11 ,共 1518 字。