关于指针解引用的疑问:a+1指向内容及函数交换逻辑咨询
嘿,我来帮你把这两个指针相关的困惑掰明白!
关于
a+1指向的内容及输出BC的原因 首先我猜你的代码大概是类似这样的(毕竟能输出BC的场景大多是字符数组):
#include <stdio.h> int main() { char a[] = "ABC"; printf("%s\n", a+1); return 0; }
咱们一步步拆解:
- 数组名
a在大多数场景下会自动转换成指向数组第一个元素的指针,也就是指向'A'的char*类型指针。 - 指针算术运算里,
a+1会根据指针类型的大小移动:因为是char*,每个char占1字节,所以a+1会精准指向数组的第二个元素——也就是'B'。 - 那为什么用
printf("%s")输出的是BC而不是单个B?因为%s的规则是:从传入的指针位置开始,逐字符打印,直到碰到字符串结束符'\0'为止。你的"ABC"在内存里实际是'A'、'B'、'C'、'\0',所以从a+1指向的'B'开始,会依次打印B、C,直到碰到末尾的'\0'才停下,结果自然就是BC。 - 如果你只想打印单个
B,得用printf("%c", *(a+1))——这里的*(a+1)就是对指针a+1的解引用,拿到它指向的单个字符值。
关于交换函数的执行逻辑(能否交换
B和C) 你没给出交换函数的具体代码,但我猜大概率是纠结传值还是传指针的问题,咱们分两种情况说:
- 如果你的交换函数是传值参数,比如这样:
那调用void swap(char x, char y) { char temp = x; x = y; y = temp; }swap(a[1], a[2])绝对不会交换原数组里的B和C!因为这是传值调用——函数拿到的是a[1]和a[2]的副本,函数内部交换的只是这两个副本的值,原数组里的元素根本没被碰过。 - 要是想真正交换
B和C,必须传指针(元素的地址),函数得写成这样:
调用的时候用void swap(char *x, char *y) { char temp = *x; *x = *y; *y = temp; }swap(&a[1], &a[2]),这样函数里的x指向a[1](也就是B的内存地址),y指向a[2](C的地址),对指针解引用*x、*y后修改的就是原数组里的元素,这才能真正完成交换。
内容的提问来源于stack exchange,提问作者SlayerDiAngelo
相关产品推荐
相关产品推荐

