You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中仅做单次解引用时双指针是否必须声明对应数据类型

链表学习中双指针类型声明相关疑问

核心疑问

学习链表相关知识时产生的问题:为什么需要为双指针声明明确的数据类型?

初步理解

  • 双指针dptr是指向指针的指针,对其做一次解引用时,得到的是指向目标数据类型的指针
  • 如果仅修改一级指针的值(即修改其存储的内存地址),不需要访问最终指向的结构体等类型的数据;只有对双指针做二次解引用时,才会访问最终指向的目标类型数据
  • 二次解引用时必须明确数据类型:*dptr是指向目标类型的指针,执行**dptr操作时必须知道*dptr指向的数据类型,才能正确完成内存访问
  • 延伸疑问:如果代码逻辑确定不会对双指针做二次解引用,是否真的有必要为双指针声明对应的数据类型?

测试代码

#include "stdio.h"
#include "stdlib.h"
typedef struct Node{
    int data;
    struct Node* next;
}Node;

void addAtBeg(int**, int);

int main(){
    int a;
    Node* head=NULL;
    printf("Enter data:\n");
    scanf("%d",&a);
    addAtBeg(&head,a);
    printf("%#x\n",head);
    printf("%d\n",(*head).data);
    return 0;
}

void addAtBeg(int** head, int a){
    Node* p;
    p=(Node *) malloc(sizeof(Node));
    p->data=a;
    p->next=*head;
    *head=p;
}

测试现象与待解答问题

测试时发现,将addAtBeg函数中用于接收主函数传入的&head的形参声明为long long int*类型,程序同样可以正常运行——表面原因是*head = p操作仅读写8字节内存空间,向对应位置写入内存地址即可完成赋值。

待确认问题:上述两种写法(将Node**类型的形参声明为int**、声明为long long int*)属于未定义行为(UB),还是符合C语言语法规范的合法写法?


内容的提问来源于stack exchange,提问作者Shrihari Hampiholi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 13:27:25