打印
[疑难问答]

C语言-双重指针

[复制链接]
1765|55
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
saservice|  楼主 | 2024-2-18 20:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
              1.双重指针含义

双重指针,就是指针指向的地址A(假设是80H地址),里面存放一个变量sp,而该变量sp是一个指针变量。


                          2.程序范例

#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
uchar a,b,c,d;
uchar *sa,**ss,**sp,*sb="edu118";
uchar  niu[10]={3,8,1,13,29,4,5};
main()
{   
  sa=niu;//H1
  ss=&sa;//H2
  a=**ss;//H3
  b=*(*ss+3);//H4
  sp=&sb;//H5
  c=**sp;//H6
  d=*(*sp+2);//H7
  printf("%d\t,%d\t",a,b);
  printf("%c\t,%c\t",c,d);
}

程序说明:

H1、sa=niu;将数组首地址送给指针sa,即指针sa指向数组niu的首地址。
H2、ss=&sa;指针sa所在的地址送给双指针ss,即指针ss指向指针sa所在的地址。
H3、a=**ss;将指针ss指向地址里面的数sa,作为指针,将sa指针指向地址里面的数取出。
H4、b=*(*ss+3);相当于b=niu[3];
H5、sp=&sb;指针sb所在的地址送给双指针sp,即指针sp指向指针sb所在的地址。
H6、c=**sp;  将指针sp指向地址里面的数sb,作为指针,将sb指针指向地址里面的数取出。
H7、d=*(*sp+2);相当于d=*(sb+2);。

使用特权

评论回复
沙发
pmp| | 2024-3-4 14:59 | 只看该作者
当你声明一个双重指针时,你需要确保你清楚这个指针将指向什么类型的指针。例如,如果你有一个整数数组,你想让一个指针指向这个数组的第一个元素的地址,然后再让另一个指针指向这个指针,你就需要声明一个int&zwnj;**类型的变量。

使用特权

评论回复
板凳
mmbs| | 2024-3-4 15:11 | 只看该作者
在使用双重指针时,通常需要为指针变量本身以及它们所指向的数据分配内存。对于动态分配的内存,务必记得在使用完毕后释放内存,以防止内存泄漏。

使用特权

评论回复
地板
xiaoyaodz| | 2024-3-4 18:36 | 只看该作者
双重指针常用于遍历数组或实现递归算法。在使用循环或递归时,要注意指针的移动和更新,以避免越界或陷入无限递归。

使用特权

评论回复
5
albertaabbot| | 2024-3-5 20:47 | 只看该作者
野指针是指指向非法内存地址的指针,例如未分配的内存或已经释放的内存。使用双重指针时,要确保它们指向的内存是有效且合法的。

使用特权

评论回复
6
juliestephen| | 2024-3-5 21:34 | 只看该作者
当你对指针进行算术运算时(如加法和减法),你需要确保你明白这些运算将如何影响指针的值。例如,如果你有一个指向数组第一个元素的指针,然后你将它加1,新的指针将指向数组的下一个元素。

使用特权

评论回复
7
hilahope| | 2024-3-7 12:23 | 只看该作者
双重指针的声明形式为 类型 **pointer_name,例如 int **p; 表示 p 是一个指向 int 类型指针的指针。
初始化时需要指向一个合法的指针地址,例如 int *arr = malloc(sizeof(int)*ROW*COLUMN); int **ptr = &arr;,或者 int x = 10; int *y = &x; int **z = &y;。

使用特权

评论回复
8
vivilyly| | 2024-3-9 20:47 | 只看该作者
当需要通过函数修改数组的形状(例如重新分配内存或改变数组的指向)时,通常需要传递数组的指针的指针。这是因为传递普通指针时,对指针副本的修改不会影响到原指针。

使用特权

评论回复
9
elsaflower| | 2024-3-10 07:50 | 只看该作者
在使用双重指针时,应该将其看作是指向具有实际含义的单重指针的指针。这意味着双重指针所指向的单重指针本身也应该是有明确用途的。

使用特权

评论回复
10
10299823| | 2024-3-10 16:16 | 只看该作者
在使用动态内存分配(如malloc或calloc)时,要确保正确地使用和释放内存,避免内存泄漏或野指针。

使用特权

评论回复
11
mollylawrence| | 2024-3-11 13:25 | 只看该作者
当你有一个双重指针时,你需要记住它实际上是两个层的间接性。这意味着你需要两次解引用才能访问到实际的变量

使用特权

评论回复
12
51xlf| | 2024-3-11 13:37 | 只看该作者
在使用双重指针时,需要注意指针的类型。确保指针的类型与所指向的数据类型相匹配。例如,如果要指向一个整数数组,那么应该使用int**类型的指针。

使用特权

评论回复
13
fengm| | 2024-3-11 14:52 | 只看该作者
需要注意指针数组和二维数组的区别。指针数组是一个数组,其元素是指针;二维数组是一个数组,其元素是一维数组。在使用双重指针时,需要根据具体情况选择合适的数据结构。

使用特权

评论回复
14
ccook11| | 2024-3-11 17:00 | 只看该作者
对于二维数组,其名字在解引用时可以视为指向数组第一行的指针,因此可以将其直接赋值给一个指向指针的指针,但在处理数组尺寸时仍需额外传递行数信息。

使用特权

评论回复
15
hilahope| | 2024-3-11 19:19 | 只看该作者
指针可以进行算术运算,如增加或减少其所指向地址的偏移量。但是,需要确保这些操作不会导致内存越界。

使用特权

评论回复
16
tifmill| | 2024-3-11 21:15 | 只看该作者
使用双重指针时,两次解引用才能到达最终数据。例如 **ptr 表示通过 ptr 找到的指针指向的值。
使用 *ptr 获取的是指向的数据所在的地址,而 **ptr 才是那个地址上存储的数据。

使用特权

评论回复
17
rosemoore| | 2024-3-11 21:29 | 只看该作者
在使用双重指针时,需要注意错误处理。例如,当使用malloc()函数分配内存失败时,程序需要能够正确处理这种情况,以免出现未定义行为。

使用特权

评论回复
18
bartonalfred| | 2024-3-12 11:08 | 只看该作者
当将一个指针赋值给双重指针时,需要确保所赋值的指针已经正确初始化并且指向有效的内存区域。

使用特权

评论回复
19
modesty3jonah| | 2024-3-12 14:17 | 只看该作者
在使用双重指针之前,确保对其进行正确的初始化,通常是指向数组的首地址。

使用特权

评论回复
20
maqianqu| | 2024-3-12 16:52 | 只看该作者
在C语言中,指针和数组有密切的关系。当你有一个指向数组的指针时,你可以使用指针来访问和操作数组的元素。但是,你需要确保你的指针运算是在数组的边界之内进行的,以避免访问非法的内存地址。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

1086

帖子

2

粉丝