指针数组<—>数组指针、动态内存、内存四区
指针数组
-
指针数组通常用来处理字符串,不需要大小
char* str = "ASEF";
puts(str);
char* pStr[3] = { "ERGFDVFD","IMiss","idfSDFef" };
for (int i = 0; i < 3; i++)
{
puts(pStr[i]);
}
print(pStr,3);
char strArray[10] = { "FEFJ" };
strArray[0] = 'L';
puts(strArray);
-
本质就是数组 -
多个指针的(一级指针)集合 int* pArray[3] = { iNum,iNum + 1,iNum + 2 };
数组指针
-
作用单一 -
常用于表示二维数组
pArray = array;
printf("第一种指针表示二维数组:\n");
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 2; j++)
{
printf("%d\t", pArray[i][j]);
}
printf("\n");
}
printf("第二种指针表示二维数组:\n");
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 2; j++)
{
printf("%d\t", *(*(pArray+i)+j));
}
printf("\n");
}
printf("第三种指针表示二维数组:\n");
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 2; j++)
{
printf("%d\t", *(pArray[i] + j));
}
printf("\n");
}
printf("第四种指针表示二维数组:\n");
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 2; j++)
{
printf("%d\t", (*(pArray+i))[j]);
}
printf("\n");
}
printArray(array, 2, 2);
-
传参的时候,表示二维数组,所以可以传入数组指针 -
在这里数组指针是一个指针变量,本质传入的是参数 void printArray(int(*pArray)[2], int row, int cols)
{
printf("数组指针传参打印数组:\n");
for (int i = 0; i < row; i++)
{
for (int j = 0; j < cols; j++)
{
printf("%d\t", pArray[i][j]);
}
printf("\n");
}
}
-
数组下标有多少列数组下标就是多少 -
数组指针产生的是一个指针变量,指针变量指向的是一个数组
int(*pArray)[2];
pArray = NULL;
数组指针解析
-
首先把数组指针+1这种操作解析为 数组指针+ sizeof(指针所指向的类型)*偏移量 p+n
int(*pArray)[2]
pArray+sizeof(int[2])*1;
指针函数
-
所有传参方式都是采用赋值的方式 -
值传递(传普通变量) void modify(int a)
{
a = 100;
}
-
地址传递(传指针) void modifyByPoint(int* a)
{
*a = 100;
}
-
不能返回局部变量的地址 int* returnValue()
{
int temp = 123;
return &temp;
}
-
修改指针指向
int g_num = 10001;
void modifyPoint(int* p)
{
p = &g_num;
}
void modifyPointCrrect(int** p)
{
*p = &g_num;
}
void printData(int* p)
{
p = &g_num;
}
动态内存申请
申请单个变量内存
int* pInt =(int *)malloc(sizeof(int) * 1);
float* pFloat = (float*)malloc(sizeof(float) * 1);
double* pDouble = (double*)malloc(sizeof(double) * 1);
if (pInt == NULL)
return;
printf("%d\n", *pInt);
*pInt = 100;
printf("%d\n", *pInt);
free(pInt);
pInt = NULL;
char* pChar = (char*)malloc(sizeof(char));
assert(pChar);
*pChar = 'A';
putchar(*pChar);
free(pChar);
pChar = NULL;
申请多个变量内存(等同于一个数组)
int Num = 0;
scanf_s("%d", &Num);
int* pArray = (int*)malloc(sizeof(int) * Num);
-
直接充当一个数组用即可 for (int i = 0; i < Num; i++)
{
pArray[i] = i;
printf("%d\t", pArray[i]);
}
free(pArray);
pArray = NULL;
-
长度可以根据用户决定 -
可以改变数组指向 char* pStr = (char*)malloc(sizeof(char) * 10);
assert(pStr);
char str[10] = { "Youngblood" };
printf("\n");
int i = 0;
while (str[i] != '\0')
{
pStr[i] = str[i];
i++;
}
pStr[i] = '\0';
puts(pStr);
pStr++;
putchar(pStr[0]);
pStr--;
free(pStr);
pStr = NULL;
动态内存申请二维数组
-
二级指针申请内存 void initArray(int **array, int row, int cols)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < cols; j++)
{
array[i][j] = cols * i + j;
}
}
}
void printArray(int** array, int row, int cols)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < cols; j++)
{
printf("%d\t", array[i][j]);
}
printf("\n");
}
}
int* p1D = (int*)malloc(sizeof(int) * 4);
free(p1D);
p1D = NULL;
int** pArray=(int**)malloc(sizeof(int*) * 4);
assert(pArray);
for (int i = 0; i < 4; i++)
{
pArray[i] = (int*)malloc(sizeof(int) * 3);
}
initArray(pArray, 4, 3);
printArray(pArray, 4, 3);
for (int i = 0; i < 4; i++)
{
free(pArray[i]);
pArray[i] = NULL;
}
free(pArray);
pArray = NULL;
-
数组指针申请内存
void initArray1(int array[][3], int row, int cols)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < cols; j++)
{
array[i][j] = cols * i + j;
}
}
}
void printArray1(int array[][3], int row, int cols)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < cols; j++)
{
printf("%d\t", array[i][j]);
}
printf("\n");
}
}
int(*p)[3] = NULL;
p = (int(*)[3])malloc(sizeof(int[3]) * 4);
initArray1(p, 4, 3);
printArray1(p, 4, 3);
free(p);
p = NULL;
自定义函数申请内存
-
传参的方式 void createArrayTwo(int** p,int size)
{
*p = (int*)malloc(sizeof(int) * size);
}
int main()
{
createArrayTwo(&array, 3);
for (int i = 0; i < 3; i++)
{
array[i] = i;
printf("%d\t", array[i]);
}
printf("\n");
free(array);
array = NULL;
return 0;
}
-
返回值的方式
int* createArray(int size)
{
int* p = (int*)malloc(sizeof(int) * size);
return p;
}
int main()
{
int* array = createArray(3);
for (int i = 0; i < 3; i++)
{
array[i] = i;
printf("%d\t", array[i]);
}
printf("\n");
free(array);
array = NULL;
return 0;
}
内存四区
-
代码区
-
栈区
- 存放局部变量,子函数参数等,内存系统自动回收
- 每一个函数的栈区都是不一样,函数名就是函数占用的地址
-
堆区
- 手动申请手动申请的
- malloc 、realloc、 calloc 申请内存都是堆区
- 堆区需要 free释放
-
全局区(静态区)
栈区----->全局区 #include <stdio.h>
int Max(int a, int b)
{
return a > b ? a : b;
}
int Min(int a, int b)
{
return a > b ? b : a;
}
int main()
{
int a = 1;
int b = 2;
int i = 0;
printf("%d\t%d\t%d\t", i++, i++, i++);
int max = Max(1, 2);
int min = Min(1, 2);
char* str = "ILoiy";
int* p = NULL;
int num = 0;
p = #
*p = 100;
p = (int*)malloc(sizeof(int));
*p = 100;
printf("%d\n", *p);
free(p);
p = NULL;
char* pstr[3] = { "Point","Feasible","d" };
pstr[0] = "Hidden";
char* ppstr = "Il";
ppstr = "Kedah";
puts(ppstr);
return 0;
}
|