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维。
-
如果基础类int变量,不需要用指针;
-
若内存块是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");
}