您的位置:首页 > 编程语言 > C语言/C++

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

2014-08-26 15:19 891 查看

在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返回正确结果。
[b]数组名与指针作为函数参数需要注意的:[/b]
看下面求数组大小的例子:


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


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: