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

}
时间: 2024-11-03 02:18:26

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

C 结构体嵌套一级指针 二级指针 动态分配内存

#define _CRT_SECURE_NO_WARNINGS #include <stdlib.h> #include <string.h> #include <stdio.h> //结构体嵌套一级指针 二级指针 动态分配内存 typedef struct _Teacher { int age; int id; char *title; char **pStuarray; char name[64]; }Teacher; //打印结构体 void printfTeac

c++中的悬浮指针和野指针 二级指针

(1) c++中的悬浮指针:声明了但没有被付值的指针,它指向内存中的任意一个空间.避免悬浮指针的一个方法是开始就付值为NULL (2)"野指针"不是NULL指针,是指向"垃圾"内存的指针.人们一般不会错用NULL指针,因为用if语句很容易判断.但是"野指针"是很危险的,if语句对它不起作用.野指针的成因主要有两种: 一.指针变量没有被初始化.任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气.所以,指针变量在创建的同

C语言中的二级指针(双指针)

原创作品,转载请标明出处http://blog.csdn.net/yming0221/article/details/7220688 C语言更多查看 C语言使用注意事项(一) C语言使用注意事项(二) C语言使用注意事项(三) 二级指针又叫双指针.C语言中不存在引用,所以当你试图改变一个指针的值的时候必须使用二级指针.C++中可以使用引用类型来实现. 下面讲解C中的二级指针的使用方法. 例如我们使用指针来交换两个整型变量的值. 错误代码如下: 一级指针 [cpp] view plaincopyp

一级指针,二级指针,指针数组,数组和指针

指针和数组指针是个用来存放地址的变量:&arr表示整个数组:arr数组名表示首元素的地址:指针解引用即表示指针所指向的内容比如:char ptr="abcdef";ptr; //指针解引用即表示它所指向的内容,即abcdefptr; //ptr里保存的是字符串的地址2.一级指针一级指针就是指指针,里面放的就是元素的地址,我们可以通过访问元素的地址来找到该地址里存放的内容,即元素本身.比如:char str1[ ]={1,2,3,4,5,6,7};3.二级指针二级指针就是指向一级

C语言一级指针与二级指针

指针的概念 指针就是地址, 利用这个地址可以找到指定的数据 指针就是地址, 那么在使用的时候, 常常会简单的说 指针变量为指针 指针变量就是存储地址的变量 int *p1;// 申请了一个变量, 即在内存中开辟了一块内存, 存储数据 // 开辟了 8 个字节, 在 Mac 下 指针都占 8 个字节 使用指针, 实际上应该说成使用指针变量 1> 算术运算 +1 移动几个字节? 看类型: int *,  long *,  char * 2> 获得地址表示的数据 指针里面存储的是地址, 就可以将该地

二级指针与二维数组

最近看<Linux C程序设计大全>这本书,虽然书中有一些错误,但整体来说,书写得还算可以. 当看到网络编程[第23.2.4小节 获得主机信息]时,遇到了一段代码,原文如下: “一台主机有许多和网络相关的信息,例如,主机名称.IP地址.主机提供的服务等.这些信息一般都保存在系统中的某个文件里(例如/etc/hosts等),用户程序可以通过系统提供的函数读取这些文件上的内容.Linux环境下使用gethostent函数读取和主机有关的信息,该函数的原型如下: 1 #include <net

指针数组,数组指针,指针函数,函数指针,二级指针详解

先看个简单的:char *p,这定义了一个指针,指针指向的数据类型是字符型,char  *(p)定义了一个指针P: char *p[4], 为指针数组,由于[]的优先级高于*,所以p先和[]结合,p[]是一个数组,暂时把p[]看成是q,也就是char *(q),定义了一个指针q,只不过q是一个数组罢了,故定义了一个数组,数组里面的数据是char *的,所以数组里面的数据为指针类型.所以char *p[4]是四个指针,这四个指针组成了一个数组,称为指针数组,既有多个指针组成的数组. char(*p

真正明白c语言二级指针

指针是C语言的灵魂,我想对于一级指针大家应该都很熟悉,也经常用到:比如说对于字符串的处理,函数参数的"值,结果传递"等,对于二级指针或者多级指针,我想理解起来也是比较容易的,比如二级指针就是指向指针的指针.....n级指针就是.... p *p **p                                      --- --- ----                                      | |->| |->| |            

C语言-二级指针

使用int **pp_val = &p_val 来定义二级指针 /* 二级指针演示 */ #include <stdio.h> int main() { int val = 0; int *p_val = &val; int **pp_val = &p_val; //表示p_val的地址 printf("pp_val是%p\n", pp_val); printf("p_val是%p\n", p_val); **pp_val = 1