C语言中&x、*x与x的区别及scanf取地址符使用场景疑问
C语言scanf取地址符规则与
*运算符用法 scanf参数的核心要求
scanf除格式字符串外的所有入参,必须是待写入变量的内存地址,所有写法差异本质都是判断传入的表达式是否已经是符合要求的地址。
&x[i]和x[i]两种写法的适用场景
两种写法的差异完全由x[i]的类型决定:
- 当
x是普通数值类型数组时(比如int x[10]),x[i]是int类型的数值本身,不是地址,所以需要用&取它的地址传给scanf,写法为scanf("%d", &x[i]),这是绝大多数场景下的正确写法。 - 当
x是指针类型数组时(比如int *x[10]),x[i]本身就是int*类型的指针(也就是地址),刚好符合scanf的入参要求,不需要额外加&,写法为scanf("%d", x[i])。
示例代码:
// 场景1:普通int数组 int num_list[5]; scanf("%d", &num_list[2]); // 正确,取数组第三个元素的地址传入 // 场景2:int指针数组 int a, b; int *ptr_list[2] = {&a, &b}; scanf("%d", ptr_list[0]); // 正确,ptr_list[0]本身就是a的地址
*x的作用与适用场景
*是C语言的解引用运算符,作用是根据指针存储的地址,访问对应内存位置的内容,和取地址符&是互逆操作:
&var表示取变量var的内存地址*ptr表示访问指针ptr指向的内存位置的内容
示例代码:
int count = 15; int *p = &count; // p存储count的地址 printf("%d", *p); // 输出15,*p等价于访问count的值 *p = 30; // 等价于count = 30,直接修改指针指向的内存内容
常见适用场景:
- 读取/修改指针指向的内存数据
- 数组操作中,
*x等价于x[0](数组名本身就是数组首元素的地址) - 自定义函数中通过指针参数修改外部变量的值
注意区分:声明指针时的
*是类型标记,不是解引用操作。比如int *x里的*只是说明x是int类型指针,和表达式中的*x作用完全不同。
内容的提问来源于stack exchange,提问作者JustAsking
相关产品推荐
相关产品推荐

