为什么类型在C中的值交换代码中不匹配?

时间:2012-07-19 03:28:39

标签: c pointers

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意味着。)

5 个答案:

答案 0 :(得分:2)

你的功能

swap(char *a, char *b)

有两个参数,两个参数都是char *类型。从字面上看,这意味着他们指向内存中的某个角色。

取消引用指针时

t = *a;

您说“抓住a指向的任何内容并将其放入t

也许混淆是因为*意味着两个相关但不同的事物。在char *的情况下,它定义了类型,特别是指向内存中某个字符的类型。在*a的情况下,*表示“查看 a 指向的字符并让我知道它是什么”。

答案 1 :(得分:2)

*令人困惑,因为它意味着两种不同但密切相关的事物。在变量声明中,*表示“指针”。在表达式中,*表示“取消引用指针”。

这是一个有用的助记符:如果您的代码中有char *a,则表示*achar

答案 2 :(得分:0)

main

  • achar
  • &a是指向char a
  • 的指针

swap

  • a是指向char
  • 的指针
  • *aa指向的字符。

你传递了一个指向指针的指针,它工作得很漂亮。尝试用框和错误绘制图片。每次都清理一下。请记住,您的代码有两个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)