C语言中*testa+N与*testa++行为差异及字符访问方法咨询
C语言指针与malloc相关问题解答
测试代码
#include<stdio.h> #include<stdlib.h> int main(){ char test[5] = "ayolw"; printf(" \nmy string : %s\n", test); char *testa = (char *)malloc(sizeof(char)); testa = test; printf("%c", *testa); printf("%c", *testa+1); printf("%c", *testa+2); printf("%c", *testa+3); printf("%c\n", *testa+4); while(*testa!='\0'){ printf("%c ", *testa); *testa++; } printf("\n\n"); return 0; }
输出结果
my string : ayolw abcde // output using *testa+1,*test+2,...; a y o l w // output using *testa++;
问题解答
1. 为什么*testa++能正确遍历字符串?
你提到的testa++等价于testa+1是错误的,二者本质完全不同:
testa+1:仅计算当前指针地址+1的新地址,原指针testa的指向完全不变,只是返回一个临时地址值。testa++:属于后置自增运算符,会先保留testa的当前地址用于后续操作,再把testa本身的指向移动到下一个内存位置(指针地址+1)。
再看运算符优先级:后置++的优先级高于一元*,所以*testa++等价于*(testa++)。结合循环逻辑:
- 第一次循环:先取
testa当前指向的'a'打印,随后testa自增指向'y'; - 第二次循环:打印当前指向的
'y',testa再自增指向'o'; - 以此类推,直到指针指向字符串末尾的
'\0',循环结束。
另外你代码里的*testa++;写法多余,testa++;就足够,因为*在这里只是取了当前指针的值但没有实际使用。
2. 不用testa[2],如何通过类似*testa+2的写法访问对应位置字符?
*testa+2的问题出在运算符优先级:*的优先级高于+,所以它是先取testa指向字符的ASCII值,再加2得到偏移后的字符,而非访问目标位置。
要访问testa指向位置往后第2个字符,需要用括号改变优先级,写成*(testa + 2)。这和数组下标testa[2]完全等价——C语言中arr[n]的本质就是*(arr + n),无论是数组名还是指针都适用。
额外注意点
你代码里的malloc存在内存泄漏:char *testa = (char *)malloc(sizeof(char));申请了内存,但紧接着testa = test;把指针指向了数组test的首地址,导致之前申请的内存地址丢失,无法被free,这是需要避免的错误写法。
内容的提问来源于stack exchange,提问作者noob0 0 00 0 0
相关产品推荐
相关产品推荐

