什么是*(a + b)和(* a + b)之间的区别

时间:2012-11-22 15:35:57

标签: c ansi

一位朋友帮我解决了这段代码,我不明白它是如何工作的。在第5行是(* pp-97)* 4基本上是char 110的大小所以(110-97)* 4或pp的扫描值?感谢

char *pp =(char*)malloc(110);
printf("Enter text: ");
scanf("%s", pp); 
*pp = *(pp + n); 
int f = (*pp - 97)*4;

4 个答案:

答案 0 :(得分:2)

请注意,*pp相当于pp[0],通常*(pp + n)相当于pp[n],所以

*pp = *(pp + n);

也可以写成pp[0] = pp[n];,将偏移char的{​​{1}}复制到偏移0的第一个n

char

这可以写成

int f = (*pp - 97)*4;

所以97(int f = (pp[0] - 97)*4; 的ASCII值)从块'a'中的第一个char中减去,并且该差值乘以4。

答案 1 :(得分:0)

这是一个非常奇怪的片段。

这一行基本上声明了一个大小为110的字符串:

char *pp =(char*)malloc(110);

这两行抓住了用户的输入:

printf("Enter text: ");
scanf("%s", pp); 

现在这就是事情开始变得怪异的地方。

*pp = *(pp + n); 

上面的行将此字符串的第一个字符更改为字符串中的第n个字符。

int f = (*pp - 97)*4;

现在就这一行而言。在这里你要解除指针pp。当你对这个指针进行derefrence时,它将是pp指向的第一个char。此char的值将转换为整数(其ASCII表示),然后减去97(这是a的ASCII值),然后乘以4.

答案 2 :(得分:0)

char *pp = malloc(110);
printf("Enter text: ");
scanf("%s", pp); 
pp[0] = pp[n]; 
int f = (pp[0] - 'a')*4;

在C中,数组运算符与指针解除引用相同。通过使用正确的表示法,代码变得更加混乱(imo)。

*(p + i)p[i]的同义词,因此*pp*(pp + 0)相同,与pp[0]

相同

答案 3 :(得分:0)

* pp = *(pp + n);

基本上你是说变量pp的第一个位置将等于pp数组的位置'n'。

int f =(* pp - 97)* 4;

在后者中,您将减去第97页的第一个位置,然后乘以4。

由于pp是char数组,*pp将等于此数组的第一个char。由于您在charint之间进行算术运算并且您正在请求int结果,因此编译器会将char(* pp)转换为整数(通过{{3上的值)然后从该整数-97中减去,然后乘以4。