0
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;
}

在上面的代码中,有一个地方让我感到困惑

我认为 ifa是一个指针,并且*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 才能传入,它意味着声明一个指针 value a,而不是 a 指向*a其他地方的值意味着)。

4

5 回答 5

2

你的功能

swap(char *a, char *b)

接受两个参数,它们的类型都是char *. 从字面上看,这意味着它们指向内存中某处的一个字符。

当您取消引用指针时

t = *a;

您是在说“抓住任何a指向的东西并将其放入t.

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

于 2012-07-19T03:34:00.117 回答
2

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

它旨在成为一个有用的助记符:如果你char *a的代码中有它意味着它*a是一个char.

于 2012-07-19T03:34:34.767 回答
0

main

  • a是一个char
  • &a是指向 char 的指针a

swap

  • a是指向 char 的指针
  • *a是 所指向的字符a

你将一个指针传递给一个指针,它工作得很好。尝试绘制带有方框和错误的图片。每次都收拾东西。请记住您的代码有两个as 和两个bs。

于 2012-07-19T03:33:42.803 回答
0

是的,星号*有多种与指针相关的含义:

  • 它用于在声明中引入包含地址的变量 - 指针:

    int *ptr = NULL;

    同样在参数列表中,例如void swap(char *, char *).

  • 它还可以用于取消引用现有指针,或获取指向的值,如在函数中swap

    t = *a;

对于刚接触 C 的学生来说,这通常会造成很大的困惑,但实际上很简单。

于 2012-07-19T03:35:25.560 回答
0

在此我们的目标是交换价值

当你写 char a='1'; 即你把'1'放在地址662442(假设&a=662442)。字符 b='2'; 即你把'2'放在地址662342(假设&b=662342)。

现在考虑交换 a 和 b,这里我们的目标是将662442(&a) 的值更改为 662342(&b)值,并将 662342(&b) 的值更改为 662442(&a) 的值

现在进行交换,我们采用一个临时变量char temp并将执行以下操作

温度=*一个;即将地址 662442(&a) 处的值赋值给 temp。

*a = *b; 即,将地址 662342(&b) 处的值分配给地址 662442(&a) 处的值。

现在我们将 a 的先前值(即保存在变量 temp 中的值)放在地址 662342(&b)

*b = 温度;即分配 temp 到地址 662442(&a)

于 2012-07-19T04:32:06.477 回答