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);
}

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值