指针数组为形参时,值得注意的地方
例1:
# include <stdio.h>
void print(char *a[10])
{
char i;
while((*++a)[0]!='0')
while(i=*++a[0]) printf("a=%d,a[0]=%d,*a[0]=%c/n",a,a[0],i);
}
void main(){
char *a[10]={"hello","welcome","thanks","goodbye","0"};
print(a);
}
例2:
#include <stdio.h>
void main() {
char *a[10]={"hello","welcome","thanks","goodbye","0"};
while((*++a)[0]!='0')
while(i=*++a[0]) printf("a=%d,a[0]=%d,*a[0]=%c/n",a,a[0],i);
}
例2能编译通过,而例1出现错误error C2105: '++' needs l-value
错误很明显例2中数组名a是个指针常量,不是变量。
当数组做为形参时,数组名就变成指针变量,所以它才能接受实参的赋值。
例3:
#include <stdio.h>
#include <string.h>
void print(char *a[10])
{
char i;
printf("a=%d,a[0]=%d,*a[0]=%c/n",a,a[0],*a[0]);
while((*++a)[0]!='0')
while(i=*++a[0]) printf("a=%d,a[0]=%d,*a[0]=%c/n",a,a[0],i);
}
main()
{
char *b[10]={"hello","welcome","thanks","goodbye","0"};
for(int i=0;i<5;i++)
printf("%s,%d/n",b[i],b[i]);
print(b);
for(i=0;i<5;i++)
for(int j=0;j<10;j++)
printf("%c,%d/n",b[i][j],&b[i][j]);
}
(*++a)[0] :a为指针变量,它的变化不会影响到b的值;++a执行后指向数组的下个成员。
*++a[0] :[ ]的优先级更高,a先和[ ]结合 即a[0];
假设a现在指向b[1],则a[0]就是b[1],那么++a[0],就是++b[1];
所以*++a[0]的执行,就会导致b[1]的值发生变化。
此应用常出现的地方
#include <stdio.h>
#include <string.h>
#define MAXLINE 1000
int getline(char *line, int max);
/* find: print lines that match pattern from 1st arg */
main(int argc, char *argv[])
{
char line[MAXLINE];
long lineno = 0;
int c, except = 0, number = 0, found = 0;
while (--argc > 0 && (*++argv)[0] == '-')
while (c = *++argv[0])
switch (c) {
case 'x':
except = 1;
break;
case 'n':
number = 1;
break;
default:
printf("find: illegal option %c/n", c);
argc = 0;
found = -1;
break;
}
if (argc != 1)
printf("Usage: find -x -n pattern/n");
else
while (getline(line, MAXLINE) > 0) {
lineno++;
if ((strstr(line, *argv) != NULL) != except) {
if (number)
printf("%ld:", lineno);
printf("%s", line);
found++;
}
}
return found;
}