C语言初级阶段7——指针3
指针数组:描述的是一个数组,存储的是指针
#include<stdio.h>
void fun(int(*arr)[2])
{
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 2; j++)
{
printf("%d\t", arr[i][j]);
}
printf("\n");
}
}
int main() {
int a = 3, b = 2, c = 1;
int* p2 = &a, * p3 = &b, * p4 = &c;
int *p1[3] = { p2,p3,p4 };
int arr1[2][2] = {
1,2,
3,4,
};
fun(arr1);
return 0;
}
数组指针:是一个指针,指向的是一个数组(二维数组起)
#include<stdio.h>
int main() {
int arr[3][3]
{
1,2,3,
4,5,6,
7,8,9
};
int(*p)[3] = arr;//这个[3]是列,行不用写。
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
printf("%d\t", arr[i][j]);
}
printf("\n");
}
return 0;
}
多级指针
int c;
int *a=&c;//一级指针
int **a1 = &a;//二级指针
int ***a2 = &a1;//三级指针
int ****a3 = &a2;//四级指针
int *****a3 = &a3;//五级指针
指针的偏移
#include<stdio.h>
int main()
{
int n[3][4]
{
{1,2,3,4},
{8,7,6,5},
{9,10,11,12},
};
int(*pn)[4] = n; int* p[3] = { n[1],n[0],n[2] };
int **pp = p;
printf("%d\n", *(*(pp+1) + 2));//两次解引用, 重点:*(pp+1)=pp[1]
printf("%d\n", *((pp[2]) - 3));//*(pp+2)=pp[2]
printf("%p\n", *pp++);
printf("%d\n", *(pp[1] + 2));
printf("%d\n", *p[1]++);
printf("%d\n", *(p[1] + 2));
printf("%d\n", *(p[2] - 3));
const char* str[4] = //VS2022需要在char前面加上const
{
"好好学习,天天向上。",
"学而时习之,不亦说乎!",
"三人行,必有我师。",
"学而不思则罔,思而不学则殆。",
};
for (int i = 0; i < 4; i++)
{
printf("%s\n", str[i]);
}
return 0;
}
内存四区:栈区、静态全局区,堆区,代码区
1.栈区:存储的局部变量系统会自动申请释放内存。
#include<stdio.h>
int main()
{
for (int i = 0; i < 10; i++)
{
int a = 0;
printf("%d\n", a);
a++;
}
return 0;
}
2.堆区:自己手动申请的内存区域,需要我们自己手动释放。
3.静态全局区:存储的静态和全局变量数据,内存只会存在一份,只会初始化一次,在程序执行结束的时候被系统释放。
#include<stdio.h>
int main()
{
for (int i = 0; i < 10; i++)
{
static int a = 0;
printf("%d\n", a);
a++;
}
return 0;
}
4.代码区:存储的是函数等。