一个指针变量所占用的内存空间是固定的。
虽然所有的指针都只占8个字节,但不同类型的变量却占不同的字节数。
结论:"定义什么类型的指针就应该指向什么类型的变量。"
int * ---> 指向int类型变量的指针
char *
double *
//----------------------指针常见的应用场景
1)在被调函数中可以修改主调函数中变量的值
编写一个函数,在这个函数修改主函数中一个变量的值
2)函数返回多个值(看起来)
结合指针 用 一个函数实现 加减乘除
num1 ,num2
一个函数 ----> 主函数中 输出 +-*/ 的结果
//--------------------函数实现两变量交换
int num1 = 10,num2 = 20;
函数中
主函数中打印 num1 : 20, num2 : 10
//------------------------二级指针 如果一个指针变量存放的又是另一个指针变量的地址,则称这个指针变量为指向指针(地址)的指针变量。也称为“二级指针”
int a = 10;
int *p = &a;
&p ----> 指针变量的地址 地址 * &p ----> p 地址 (&a) * p ---> a
int a = 5;
int *p = &a;
int ** p1 = &p;
p---指向a的地址
*p---a的地址对应的值----也就是5
p1--指针变量p的地址 &p
*p1 ---> p p的地址所对应的内容 --- a的地址
* *p1 ----> * a的地址 --> *p --> 5
//-----------------------指针数组 : 存储指针的数组 什么是指针数组? 是一个数组! 里面的数组元素都是地址
int a = 10,b = 15,c = 20;
int *pa[3] = {&a,&b,&c}; //指针数组
pa[0] ----> &a pa[1] ----> &b pa[2] ----> &c
类型说明符 *数组名[数组长度]
//定义了一个指针数组 跟二维数组结合 类型说明符 *数组名[二维数组第一维长度] int arr[2][3] = { 1,2,3, 4,5,6 };
int *pa[2] = {arr[0],arr[1]};
for(int i = 0;i < 2;i++){ for(int j = 0;j<3;j++){ *(pa+j) // pa[j]; } }
//-----------------------数组名遍历数组元素 &arr == arr == &arr[0] == arr[0] == &arr[0][0] ---> 数组的首地址 / 意义不同
&arr --> 整个数组的地址 +1(越界)
arr --> 指向数组第1行的地址 &arr[0]
&arr[0] --> 指向数组第1行的地址
arr[0] --> 第1行的内容/二维数组的第一个一维数组 指向这个一维数组第一个元素的地址 == &arr[0][0]
&arr[0][0] 整个二维数组第1个一维数组里面第一个元素的地址 //-----------------------
int a[3][4] = { {1,2,3,4}, {5,6,7,8}, {9,10,11,12} };
访问 第1行的第1个元素地址表示:
&a[0][0] == a[0] == *a
获取第1行的第1个元素值的方式:
a[0][0] == *a[0] = **a
|