*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;就完全错了:
- 这时候
ip还没被初始化,指向的是一块随机的内存地址,直接解引用会触发未定义行为; &var是地址类型(int*),而*ip是int类型,类型不匹配,编译器会直接报错。
简单总结一下:
ip= 指针变量本身,存储的是一个内存地址*ip= 对指针解引用,代表这个地址里存储的实际数据- 声明时的
*只是标记变量类型,和执行时的解引用*是完全不同的用法~
内容的提问来源于stack exchange,提问作者sign9
相关产品推荐
相关产品推荐

