C语言,求大神指导,不能理解for循环里面的意思。(特别是if语句里的*q=(*p)-'0';)

#include <stdio.h>
void main()
{
char c[100],*p=c;
int a[50], *q=a,num=0,i;
printf("请输入一串可带有任意字符的字符串:\n");
gets(c);
printf("\nOutput:\n");
for(; *p!='\0'; p++)
if(*p>='0'&&*p<='9')
{
*q=(*p)-'0';
p++;
while(*p>='0'&&*p<='9')
*q=(*q)*10+(*(p++)-'0');
num+=1;
q+=1;
}
putchar('\n');
printf("现从你输入的字符串中检测到了%d个整数。\n\n它们分别是:",num);
for(i=0,q=a; i<num; i++,q++)
printf("%d ",*q);
printf("\n\n");
}
*q=(*q)*10+(*(p++)-'0');这个也不能理解,求指导

指针p 是char 型,专门用于指向 字符 或 字符串。这里用来指向 c数组的元素。
语句里 p 表示指向的 地址。p++, 是后缀加加,在表达式里 用原来的地址,出了表达式以后,指向 新的地址,新的地址 = 原地址+1,例如,原来指向 c[0] 的地址 &c[0]; 新的地址指向c[1]的地址 &c[1]了。
按语法,经过 p++ 运算, 表示指向的 地址 加了 1* sizeof(char) 。
语句里 *p 表示指向的 值。注意,这里讲的是语句里(不是声明里,声明里一样外形的东西,意思不同于语句,c/c++奇葩!)。注意 *p 有星号。 语法里 这里的 * 号是 “求值运算符”,不是乘号(c/c++奇葩!)。p 指向 c[0] 的地址 &c[0] 时,*p 表示c[0]里存放的 字符的值( ASCII 码值)。p++ 以后,,*p 表示c[1]里存放的 字符的值。
指针q 是int型,专门用于指向 整型。这里用来指向 a数组的元素。
语句里 *q 表示指向的 值。q 指向 a[0] 的地址 &a[0] 时, *q 表示 a[0] 里的值。
若执行了 q++; 那么 q 指向 a[1] 的地址 &a[1], *q 表示 a[1] 里的值了。
*q=(*q)*10+(*(p++)-'0'); 这里用到后缀自增运算,按语法要分解成2步运算:
第一步: *q=(*q)*10+(*(p)-'0'); 这里是值的运算。
第二步: p=p+1; 这里是地址的运算,使 p 指到 下一个字符。
------------
假定 c[100]="kn87"; p 现在指向 c[2],
*(p)-'0' 就是 c[2]里存放的字符'8'的ASCII值; *(p) -'0' = 字符'8'的ASCII值 - 字符 '0' 的ASCII值 = 整型数值 8。 (注意有单引号与没有单引号的区别)。
假定 现在 q 指向 a[0], a[0]当前值等于1,那么 *q 就等于 1。
(*q)*10 = 1 * 10, 得 10。
第一步: *q=(*q)*10+(*(p)-'0');
即 *q = a[0] * 10 + (c[2] - '0') = 1 * 10 + ('8'-'0') = 10 + 8 = 18;
第二步: p=p+1; 使 p 指向 c[3] .
循环里 的 q+=1; 使 q 指向 a[1]的地址 &a[1], *q 等于 数值 a[1]。
你要分清的是: 语句里,p,q 是地址,*p,*q 是值c[i],a[j], 和 后缀自增1的运算规则。
温馨提示:答案为网友推荐,仅供参考