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