✨hello,愿意点进来的小伙伴们,你们好呐!✨
🐻🐻系列专栏:【C语言基础】
🐲🐲本篇内容:浅学指针基础
🐯🐯作者简介:一名大一即将升大二的三非编程小白
前言
指针是什么?
内存空间怎么管理呢?
切割成内存单元 – 1 byte(字节) – (最小单元)
每一个内存单元都有z自己独有的编号,这个编号就叫做地址(地址也称为指针)
指针其实就是地址,地址就是指针
指针就是内存单元的编号。
🐼🐼然后指针有一级指针与二级指针之分
二级指针
定义了
int a = 10;int* p = &a;
p就是一个指针变量,是一级指针变量,用来存放 变量a 的地址。int** pa = &p;
,将 p 的地址取出来存放到 pa 中,pa是来存放 p 的地址的,是一个二级指针变量。
**pa = 30;
解引用一次 :找到 a 的指针,解引用第二次 : 找到a
int main(){
int a = 10;
int* p = &a;//p 是一个指针变量,一级指针变量
*p = 20;
int** pa = &p;//pa 是来存放 p 的地址的,是一个二级指针变量
**pa = 30;//解引用一次 :找到 a 的指针;
//解引用第二次 : 找到a
//int* * pa
//int* 是在指 pa 指向的对象是 int* 类型,* 说明pa是指针
//二级指针是来存放 一级指针变量的地址 的地址
return 0;
}
对二级指针的理解:
int * * pa:
int * 是在指 pa 指向的对象是 int* 类型,* 说明pa是指针
二级指针是来存放 一级指针变量的地址 的地址
指针数组
顾名思义,用来存放指针的数组就称为指针数组。
int* parr[10]
parr 就是一个存放 指针类型为 int* 的指针数组。
int main() {
int a = 10;
int b = 12;
int c = 50;
int* pa = &a;
int* pb = &b;
int* pc = &c;
int* parr[10] = { &a,&b,&c };
//存放 整型指针类型 的数组
for (int i = 0; i < 3; i++) {
printf("%d\n", *parr[i]);
}
return 0;
}
指针数组还可以”伪装“成二维数组
普通二维数组的遍历:
for (i = 0; i < 3; i++) {
for (j = 0; j < 4; j++) {
printf("%d ",arr[i][j]);
}
printf("\n");
}
用指针数组模拟二维数组后的遍历:
int arr1[4] = { 1,2,3,4 };
int arr2[4] = { 5,6,7,8 };
int arr3[4] = { 9,10,11,12 };
int* parr[3] = { arr1,arr2,arr3 };
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
//printf("%d ", *(parr[i] + j));
printf("%d ", parr[i][j]);
}
parr[ 0 ]找到数组 arr1,然后有两种方法可以访问到数组中的元素:
1.
通过printf("%d ", *(parr[i] + j));
,比如:parr[0] + 1找到数组 arr1的首元素,然后再 加 1 ,找到,该数字首元素的下一个元素的地址,然后解引用,将该地址的元素打印出来。
2.
通过printf("%d ", parr[i][j]);
,比如:parr[0][1],找到了数组arr1的地址,然后通过下标访问找到arr1的第二个元素。并打印。
本质上:
*(parr[i] + j) == parr[i][j]
int main() {
int arr[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,22 };
//1 2 3 4
//5 6 7 8
//9 10 11 22
int i = 0;
int j = 0;
for (i = 0; i < 3; i++) {
for (j = 0; j < 4; j++) {
printf("%d ",arr[i][j]);
}
printf("\n");
}
int arr1[4] = { 1,2,3,4 };
int arr2[4] = { 5,6,7,8 };
int arr3[4] = { 9,10,11,12 };
int* parr[3] = { arr1,arr2,arr3 };
//模拟二维数组
//
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
//printf("%d ", *(parr[i] + j));
printf("%d ", parr[i][j]);
}
printf("\n");
}
return 0;
}