C语言一级指针、二级指针、数组作为参数传递需要注意的若干问题

在C语言编程时,经常会用到指针或数组作为参数传递,但有时结果却并不是自己想要的。下面总结下指针、数组作为参数传递需要的问题。
一级指针与二级指针的使用范围:

       一级指针存放变量的地址,指向的值是变量的内容。如int* p={1,2,3}, p=数组的首地址,*p=数组的第一个值;
       二级指针存放一级指针的地址,指向一级指针。如int*p ={1,2,3}, int**pp=&p,pp=指针p的首地址,*pp=数组的首地址,**pp=数组第一个值1。
在作为参数传递时什么时候用一级指针,什么时候用二级指针?
       一级指针作为参数传递时,由实参赋予形参对其指向内容的修改的能力,但是一旦修改形参的指向使其指向其它地方,则这种改变不会返回给实参,此时若要使实参的指针指向地址发生改变则使用二级指针。如下例:
        
void find1(char array[], char search, char * pa)
{
int i;
for (i=0;*(array+i)!=0;i++)
{
if (*(array+i)==search)
{
pa=array+i;
break;
}
else if (*(array+i)==0)
{
pa=0;
break;
}
}
}
void find2(char array[], char search, char** pa)
{
int i;
for (i=0;*(array+i)!=0;i++)
{
if (*(array+i)==search)
{
(*pa)=array+i;
break;
}
else if (*(array+i)==0)
{
(*pa)=0;
break;
}
}
}
void main()
{
char str[]={"afsdfsdfdf\0"}; //待查找的字符串
char a=‘d‘; //设置要查找的字符
char * p=0; //如果查找到后指针p将指向字符串中查找到的第一个字符的地址。
//find1(str,a,p); //调用函数以实现所要操作。
//find2(str,a,&p);
if (0==p )
{
printf ("Not found!\n");//1.如果没找到则输出此句
}
else
{
printf("found! p=%d",*p); //如果找到则输出此句
}
}
find1无法返回正确结果,而find2返回正确结果。
数组名与指针作为函数参数需要注意的:
看下面求数组大小的例子:
void fun(char str[],char *p)
{
printf("fun str= %d,",sizeof(str));
printf("p=%d,",sizeof(p));
}
void main()
{
char str[]={"afsdfsdfdf\0"}; //待查找的字符串
char *p=str;
printf("main str= %d,",sizeof(str));
printf("p=%d,",sizeof(p));
fun(str,p);
}
输出结果:
说明用数组名作为参数传递时,在由实参赋形参时,形参的数组名与指针等价,其无法记录数组大小,因此在函数中若用到数组的大小,应在定义它的主函数中求得大小并作为参数传递到函数中。如下:
void fun(char str[],int strlen,char *p)
{
...
}
void main()
{
char str[]={"afsdfsdfdf\0"}; //待查找的字符串
char *p=str;
printf("main str= %d,",sizeof(str));
printf("p=%d,",sizeof(p));
fun(str,sizeof(str),p);
}

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。