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

*ip与ip是否为同一事物?C语言指针赋值为何无需使用*?

嘿,这个问题问得特别戳中指针初学者的痛点,很多刚摸C语言指针的小伙伴都会在*的用法上绕晕,我来给你掰扯清楚~

先把你给的代码格式化一下,看起来更清晰:

#include <stdio.h>
int main () {
    int var = 20; /* 普通整型变量声明 */
    int *ip; /* 指针变量声明 */
    ip = &var; /* 将var的地址存入指针变量ip */

    printf("Address of var variable: %x\n", &var );
    /* 打印指针变量ip中存储的地址 */
    printf("Address stored in ip variable: %x\n", ip );
    /* 通过指针访问实际变量的值 */
    printf("Value of *ip variable: %d\n", *ip );

    return 0;
}
关于*ip和ip的区别,以及ip = &var为什么不用*的解释

首先明确:*ip和ip绝对不是同一个东西,它们的含义完全取决于上下文:

  • 当你在声明变量时:int *ip;,这里的*是指针类型标记符,只是用来告诉编译器「ip是一个指向int类型的指针变量」,它只是类型声明的一部分,不是操作符。
  • 当你在执行代码语句时(比如printf("Value of *ip variable: %d\n", *ip );),这里的*是解引用操作符,作用是:通过指针ip存储的内存地址,去读取这个地址里存放的实际值。这时候*ip就等价于变量var的值(因为ip存的是var的地址)。
  • 而单独的ip,它就是指针变量本身,存储的是一个内存地址(在这个例子里就是var的地址&var)。

那为什么ip = &var;里不用*呢?
因为我们要做的是把var的地址直接赋值给指针变量ip本身,而不是赋值给ip指向的内存空间。如果写成*ip = &var;就完全错了:

  1. 这时候ip还没被初始化,指向的是一块随机的内存地址,直接解引用会触发未定义行为;
  2. &var是地址类型(int*),而*ip是int类型,类型不匹配,编译器会直接报错。

简单总结一下:

  • ip = 指针变量本身,存储的是一个内存地址
  • *ip = 对指针解引用,代表这个地址里存储的实际数据
  • 声明时的*只是标记变量类型,和执行时的解引用*是完全不同的用法~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 20:22:30