编号 | 指针函数参数 内存分配方式(级别+堆栈) | 主调函数 实参 | 被调函数 形参 | 备注
| ||||
|
|
|
|
|
| |||
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");
}