void swap(char *a,char *b){
char t;
t = *a;
*a = *b;
*b = t;
}
int main(void){
char a = '1';
char b = '2';
swap(&a,&b);
printf("The value is %c and %c respectively\n",a,b);
return 0;
}
在上面的代码中,有一个让我困惑的地方
我认为如果a
是指针,*a
是指向的值
int *ptr, a = 1;
ptr = &a;
printf("The value of *ptr should be a: %d\n",*ptr);
printf("The value of *a should be an hex address: %p\n",ptr);
所以在swap(char *a, char *b)
函数中,它取值而不是指针(* a不是a),
swap(&a, &b)
但它实际上将指针值作为参数传递给它,并且代码有效。任何人都可以向我解释一下吗?(我认为对于swap(char *a){...}
部分,声明并不意味着它需要* a传递,它意味着声明一个指针值a
,而不是值a在其他地方指向*a
意味着。)
答案 0 :(得分:2)
你的功能
swap(char *a, char *b)
有两个参数,两个参数都是char *
类型。从字面上看,这意味着他们指向内存中的某个角色。
取消引用指针时
t = *a;
您说“抓住a
指向的任何内容并将其放入t
。
也许混淆是因为*
意味着两个相关但不同的事物。在char *
的情况下,它定义了类型,特别是指向内存中某个字符的类型。在*a
的情况下,*
表示“查看 a 指向的字符并让我知道它是什么”。
答案 1 :(得分:2)
*
令人困惑,因为它意味着两种不同但密切相关的事物。在变量声明中,*
表示“指针”。在表达式中,*
表示“取消引用指针”。
这是一个有用的助记符:如果您的代码中有char *a
,则表示*a
是char
。
答案 2 :(得分:0)
在main
:
a
是char
&a
是指向char a
。在swap
:
a
是指向char *a
是a
指向的字符。你传递了一个指向指针的指针,它工作得很漂亮。尝试用框和错误绘制图片。每次都清理一下。请记住,您的代码有两个a
和两个b
s。
答案 3 :(得分:0)
是的,星号*
有多个与指针相关的含义:
它在声明中用于引入包含地址的变量 - 指针:
int *ptr = NULL;
同样在参数列表中,例如void swap(char *, char *)
。
它也可用于取消引用现有指针,或获取指向的值,如函数swap
中所示:
t = *a;
这通常会给刚接触C的学生造成很大的困惑,但实际上很简单。
答案 4 :(得分:0)
我们的目标是交换价值
当你写char ='1';即你在地址662442处设置'1'(假设& a = 662442)。 char b ='2';即你在地址662342处设置'2'(假设& b = 662342)。
现在考虑交换a和b,这里我们的目标是将值改为662442(& a),值为662342(& b),值为662342(& a) b)价值为662442(& a)。
现在换换我们采取一个临时变量 char temp 并执行以下操作
温度= * A;即将地址662442(& a)的值分配给临时。
* a = * b;即将地址662342(& b)的值指定为地址662442(& a)的值。
现在我们将a的前一个值(即保存在变量温度中的值)放在地址662342(& b)
* b = temp;即将temp分配给地址662442(& a)