一位朋友帮我解决了这段代码,我不明白它是如何工作的。在第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;
答案 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。由于您在char
和int
之间进行算术运算并且您正在请求int结果,因此编译器会将char(* pp)转换为整数(通过{{3上的值)然后从该整数-97中减去,然后乘以4。