什么是指针?如何理解指针?指针又是如何定义与使用的?

本文详细介绍了C语言中的指针概念,包括指针的本质、内存地址表示、指针类型、指针赋值方式及使用注意事项。同时,阐述了函数参数作为指针时的行为与区别,以及指针在不同场景下的应用。

指针:

    指针就是地址,地址就是指针

 

    内存地址都是以16进制表现的,表现形式为以0x开头,然后后面是1-9还有a-f

 

    

    我们如果想把指针给保存起来,有指针类型!

 

    指针类型:

            总结而言就是类型加*就是指针类型

 

        指针类型

            int *

            char *

            float *

            double *

            long *

            short *

 

    指针类型的赋值:

            1.先声明后赋值

                类型* 指针变量名;

                指针变量名 = 地址;

 

                int num = 10;

                int *p;

                p = #

 

 

            2.声明的时候初始化

                类型* 指针变量名 = 地址;

                int num = 20;

                int *p = #

 

            定义的时候,*不能省略

 

 

    在使用指针变量的时候加*和不加*的区别:

 

            1.加*访问的是自己所指向的空间的数据,也就是访问别人的妹纸

 

            2.不加*访问的是自己空间里面存的地址,也就是访问自家的美娇娘

 

 

    函数用一个指针类型作为形参,也相当于是一个局部变量

 

 

 

    C语言中,除了数组以外(数组是共享的,那么形参和实参才是同一个东西),其他类型作为函数的形参,调用函数时都会开辟空间


### 二维数组指针的基本关系 C语言中的二维数组本质上可以被视为一个一维数组,其每个元素本身又是一个一维数组。例如,定义 `int a[3][4];` 表示一个包含3个元素的数组,其中每个元素都是一个包含4个整型数的一维数组[^3]。这种结构使得二维数组可以通过指针进行访问和操作。 ### 指针访问二维数组的方式 在C语言中,可以通过指向数组的指针来访问二维数组。对于一个二维数组 `int a[3][4];`,声明一个指针变量并将其指向该数组是可行的: ```c int (*p)[4]; // p 是一个指向含有4个整型数的数组的指针 p = a; // 将二维数组 a 的首地址赋给 p ``` 此时,指针 `p` 可以用来访问数组 `a` 中的各个元素。例如,`*(*(p + i) + j)` 或者等价地写成 `p[i][j]` 可以用来获取第 `i` 行第 `j` 列的元素值[^3]。 ### 二维数组名作为指针 二维数组名可以视为指向其第一个元素(即第一行)的指针。这意味着 `a` 和 `&a[0]` 都表示数组的起始地址;同样地,`a[i]` 或 `*(a + i)` 表示第 `i` 行的起始地址。进一步地,`&a[i][j]`、`a[i] + j` 或 `*(a + i) + j` 均可用于获取特定元素的地址,而 `*(*(a + i) + j)` 或 `a[i][j]` 则用于取得该位置上的实际值[^3]。 ### 示例代码说明指针如何操作二维数组 下面的例子展示了如何使用指针遍历一个已初始化的二维数组,并打印出所有元素的值: ```c #include <stdio.h> int main() { int a[3][4] = {{1, 3, 5, 7}, {9, 11, 13, 15}, {17, 19, 21, 23}}; int (*p)[4]; // 定义一个指向具有4个整型成员的数组的指针 p = a; // 让指针指向数组 a 的开始处 for (int i = 0; i < 3; ++i) { for (int j = 0; j < 4; ++j) { printf("Element at [%d][%d]: %d\n", i, j, *(*(p + i) + j)); } } return 0; } ``` 在这个程序里,外层循环控制行数,内层循环处理每一行中的列。通过增加指针 `p` 的偏移量 `i` 来移动到正确的行,再通过 `j` 移动到具体的列,从而能够访问到每一个单独的元素[^3]。 ### 指针二维数组的区别 尽管二维数组名可以被当作指针使用,但它们之间存在本质区别。数组名是一个常量指针,不能被修改以指向另一个内存位置,而普通指针变量则可以自由地改变其所指向的位置。此外,在传递参数时,如果函数需要接收一个二维数组,则必须明确指定除第一维之外的所有维度大小,如 `void func(int arr[][4])` 所示,这是因为编译器需要知道每行有多少元素才能正确计算地址偏移量[^2]。 ### 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值