C语言之指针专题四:指针做函数参数

编号

指针函数参数

内存分配方式(级别+堆栈)

主调函数

实参

被调函数

形参

备注

 

 

 

 

 

 

 

01

1级指针

(做输入)

分配

使用

一般应用禁用

分配

使用

常用

Int showbuf(char *p);  

int showArray(int *array, int iNum)

02

1级指针

(做输出)

使用

结果传出

常用

int geLen(char *pFileName, int *pfileLen);

03

2级指针

(做输入)

分配

使用

一般应用禁用

分配

使用

常用

int main(int arc ,char *arg[]);指针数组

int shouMatrix(int [3][4], int iLine);二维字符串数组

04

2级指针

(做输出)

使用

分配

常用,但不建议用,转化成02

int getData(char **data, int *dataLen);

Int getData_Free(void *data);

Int getData_Free(void **data); //避免野指针

05

3级指针

(做输出)

使用

分配

不常用

int getFileAllLine(char ***content, int *pLine);

int getFileAllLine_Free(char ***content, int *pLine);

                 

 

指针做函数参数,问题的实质不是指针,而是看内存块,内存块是1维、2维。

  1. 如果基础类int变量,不需要用指针;

  2. 若内存块是1维、2维。



1、二级指针三种内存模型的建立:堆区、栈区、常量区

  2、二级指三种内存模型字符串排序举例:

 


1、二级指针第一种内存模型:常量区

int sortArray07(char**pstr, int num)
{
 int i = 0, j = 0;
 int ret = 0;
 char*tmp = NULL;     //交换的是指针变量,因此定义一个临时指针变量
 if (pstr == NULL)
 {
  ret = -1;
  printf("sortArray07() param err:%d\n", ret);
  return ret;
 }
 for (i = 0; i < num; i++)
 {
  for (j = i + 1; j < num; j++)
  {
   if (strcmp(pstr[i], pstr[j])>0)
   {
    tmp = pstr[i];
    pstr[i] = pstr[j];
    pstr[j] = tmp;
   }
  }
 }
 return ret;
}
void main07()

 char*myArray[] = { "bbbb", "111111", "aaaaa", "ccccc" };//字符串在常量区,四个指针变量存放了该地址
 printf("排序前\n");
 printArray07(myArray, 4);
 sortArray07(myArray, 4);
 printf("排序后\n");
 printArray07(myArray, 4);
 system("pause");
}




2、二级指针第二种内存模型:栈区

int sortArray08(char (*pstr)[10], int num)
{
 int i = 0, j = 0;
 char tmp[1024] = { 0 };    //交换的是只存空间的内容,而不是指针变量,因此定义一个临时缓冲区充当交换空间
 for (i = 0; i < num; i++)
 {
  for (j = i + 1; j < num; j++)
  {
   if (strcmp(pstr[i], pstr[j])>0)
   {
    strcpy(tmp, pstr[i]);
    strcpy(pstr[i], pstr[j]);
    strcpy(pstr[j], tmp);
   }
  }
 }
 return 0;
}
void main08()
{
 char myArray[][10] = { "bbbb", "111111", "aaaaa", "ccccc" };//字符串在栈区,从常量区拷贝到栈区
 printf("二级指针第二种内存模型排序前\n");
 printArray08(myArray, 4);
 sortArray08(myArray, 4);
 printf("二级指针第二种内存模型排序后\n");
 printArray08(myArray, 4);
 system("pause");
}




3、二级指针第三种内存模型:堆区



//交换的是指针变量所指向空间的内容、类似栈区空间内容的交换




int sortArray091(char**pstr, int num)
{
 int i = 0, j = 0;
 char tmp[1024] = { 0 };
 for (i = 0; i < num; i++)
 {
  for (j = i + 1; j < num; j++)
  {
   if (strcmp(pstr[i], pstr[j])>0)
   {
    strcpy(tmp ,pstr[i]);
    strcpy(pstr[i], pstr[j]);
    strcpy(pstr[j], tmp);
   }
  }
 }
 return 0;
}

//交换的是指针变量,和常量区交换是一样的


int sortArray092(char**pstr, int num)
{
 int i = 0, j = 0;
 char*tmp = NULL;      //交换的是指针变量
 for (i = 0; i < num; i++)
 {
  for (j = i + 1; j < num; j++)
  {
   if (strcmp(pstr[i], pstr[j])>0)
   {
    tmp = pstr[i];
    pstr[i] = pstr[j];
    pstr[j] = tmp;
   }
  }
 }
 return 0;
}
char**getMem( int num)
{
 char**myArray = (char**)malloc(100 * sizeof(char*)); 
 for (int i = 0; i < num; i++)
 {
  myArray[i] = (char*)malloc(12 * sizeof(char));
 }
 return myArray; 
}
void main()
{
 char**myArray = NULL;
 myArray = getMem(4);
 if (myArray == NULL)
 {
  printf("malloc err\n");
  return;
 }
 strcpy(myArray[0], "bbbb");
 strcpy(myArray[1], "111111");
 strcpy(myArray[2], "aaaaa");
 strcpy(myArray[3], "ccccc");
 printf("二级指针第三种内存模型排序前\n");
 printArray09(myArray, 4);
 //交换指针变量
 //sortArray091(myArray, 4);
 //交换指针变量所指向的空间
 sortArray092(myArray, 4);
 printf("二级指针第三种内存模型排序后\n");
 printArray09(myArray, 4); 
 system("pause");
}








    

  




编号

指针函数参数

内存分配方式(级别+堆栈)

主调函数

实参

被调函数

形参

备注

 

 

 

 

 

 

 

01

1级指针

(做输入)

分配

使用

一般应用禁用

分配

使用

常用

Int showbuf(char *p);  

int showArray(int *array, int iNum)

02

1级指针

(做输出)

使用

结果传出

常用

int geLen(char *pFileName, int *pfileLen);

03

2级指针

(做输入)

分配

使用

一般应用禁用

分配

使用

常用

int main(int arc ,char *arg[]);指针数组

int shouMatrix(int [3][4], int iLine);二维字符串数组

04

2级指针

(做输出)

使用

分配

常用,但不建议用,转化成02

int getData(char **data, int *dataLen);

Int getData_Free(void *data);

Int getData_Free(void **data); //避免野指针

05

3级指针

(做输出)

使用

分配

不常用

int getFileAllLine(char ***content, int *pLine);

int getFileAllLine_Free(char ***content, int *pLine);

                 

 

指针做函数参数,问题的实质不是指针,而是看内存块,内存块是1维、2维。

  1. 如果基础类int变量,不需要用指针;

  2. 若内存块是1维、2维。



1、二级指针三种内存模型的建立:堆区、栈区、常量区

  2、二级指三种内存模型字符串排序举例:

 


1、二级指针第一种内存模型:常量区

int sortArray07(char**pstr, int num)
{
 int i = 0, j = 0;
 int ret = 0;
 char*tmp = NULL;     //交换的是指针变量,因此定义一个临时指针变量
 if (pstr == NULL)
 {
  ret = -1;
  printf("sortArray07() param err:%d\n", ret);
  return ret;
 }
 for (i = 0; i < num; i++)
 {
  for (j = i + 1; j < num; j++)
  {
   if (strcmp(pstr[i], pstr[j])>0)
   {
    tmp = pstr[i];
    pstr[i] = pstr[j];
    pstr[j] = tmp;
   }
  }
 }
 return ret;
}
void main07()

 char*myArray[] = { "bbbb", "111111", "aaaaa", "ccccc" };//字符串在常量区,四个指针变量存放了该地址
 printf("排序前\n");
 printArray07(myArray, 4);
 sortArray07(myArray, 4);
 printf("排序后\n");
 printArray07(myArray, 4);
 system("pause");
}




2、二级指针第二种内存模型:栈区

int sortArray08(char (*pstr)[10], int num)
{
 int i = 0, j = 0;
 char tmp[1024] = { 0 };    //交换的是只存空间的内容,而不是指针变量,因此定义一个临时缓冲区充当交换空间
 for (i = 0; i < num; i++)
 {
  for (j = i + 1; j < num; j++)
  {
   if (strcmp(pstr[i], pstr[j])>0)
   {
    strcpy(tmp, pstr[i]);
    strcpy(pstr[i], pstr[j]);
    strcpy(pstr[j], tmp);
   }
  }
 }
 return 0;
}
void main08()
{
 char myArray[][10] = { "bbbb", "111111", "aaaaa", "ccccc" };//字符串在栈区,从常量区拷贝到栈区
 printf("二级指针第二种内存模型排序前\n");
 printArray08(myArray, 4);
 sortArray08(myArray, 4);
 printf("二级指针第二种内存模型排序后\n");
 printArray08(myArray, 4);
 system("pause");
}




3、二级指针第三种内存模型:堆区



//交换的是指针变量所指向空间的内容、类似栈区空间内容的交换




int sortArray091(char**pstr, int num)
{
 int i = 0, j = 0;
 char tmp[1024] = { 0 };
 for (i = 0; i < num; i++)
 {
  for (j = i + 1; j < num; j++)
  {
   if (strcmp(pstr[i], pstr[j])>0)
   {
    strcpy(tmp ,pstr[i]);
    strcpy(pstr[i], pstr[j]);
    strcpy(pstr[j], tmp);
   }
  }
 }
 return 0;
}

//交换的是指针变量,和常量区交换是一样的


int sortArray092(char**pstr, int num)
{
 int i = 0, j = 0;
 char*tmp = NULL;      //交换的是指针变量
 for (i = 0; i < num; i++)
 {
  for (j = i + 1; j < num; j++)
  {
   if (strcmp(pstr[i], pstr[j])>0)
   {
    tmp = pstr[i];
    pstr[i] = pstr[j];
    pstr[j] = tmp;
   }
  }
 }
 return 0;
}
char**getMem( int num)
{
 char**myArray = (char**)malloc(100 * sizeof(char*)); 
 for (int i = 0; i < num; i++)
 {
  myArray[i] = (char*)malloc(12 * sizeof(char));
 }
 return myArray; 
}
void main()
{
 char**myArray = NULL;
 myArray = getMem(4);
 if (myArray == NULL)
 {
  printf("malloc err\n");
  return;
 }
 strcpy(myArray[0], "bbbb");
 strcpy(myArray[1], "111111");
 strcpy(myArray[2], "aaaaa");
 strcpy(myArray[3], "ccccc");
 printf("二级指针第三种内存模型排序前\n");
 printArray09(myArray, 4);
 //交换指针变量
 //sortArray091(myArray, 4);
 //交换指针变量所指向的空间
 sortArray092(myArray, 4);
 printf("二级指针第三种内存模型排序后\n");
 printArray09(myArray, 4); 
 system("pause");
}








    

  




猜你喜欢

转载自blog.csdn.net/cyb519/article/details/78178622