一、什么是指针? 二、指针的定义 三、指针的用途举例 四、关于指针的疑问
一、什么是指针? 比如说我们到图书馆想要找到我们需要的书,那么一定是通过电脑根据书名来查看所需要的图书在图书馆的几层几排几号,然后你就可以直接到相应的书架上找到所需的图书。在C语言中,这里的书名就相当于是一个指针,几层几排几号就相当于是这个指针所指向的地址,那么这个地址中所存储的图书就相当于指针所指向这个地址的内存空间中的数据。 二、指针的定义 定义:类型标识符 *指针变量名,如: 三、指针的用途举例
例1: 在学指针前,我们在进行基本运算时,需取出相应方法的返回值,且一个方法只能得到一个返回值,利用指针后,即使方法无返回值,也能同时计算出多个不同公式的计算结果:
- #include <stdio.h>
- void jisuan(int *a, int *b, int *cheng, int *chu);
- int main() {
- int a = 5, b = 8, cheng, chu;
- jisuan(&a, &b, &cheng, &chu);
- printf("sum = %d\n", a);
- printf("jian = %d\n", b);
- printf("cheng = %d\n", cheng);
- printf("chu = %d\n", chu);
-
- // 已知int a = 5; int *p = &a;情输出指针本身的地址,及指针的值,及其所指向内存空间的值。
- int *p = &a;
- printf("*p的地址:%p,指针的值:%p,所指向内存空间的值:%d\n",&p, p, *p);
-
- return 0;
- }
- // 实现两个整数的加减乘除
- void jisuan(int *a, int *b, int *cheng, int *chu) {
- *a = *a + *b;
- *b = *a - *b;
- *cheng = *a * *b;
- *chu = (*a) / (*b);
- }
因此,有了指针,我们可以让函数有“无限个”返回值。
四、关于指针的疑问
1. 不同编译环境下,一个指针变量占用的内存空间是多少?
| 16位编译环境 | 32位编译环境 | 64位编译环境 | int | 2 | 4 | 8
| void *(指针变量) | 2 | 4 | 8 |
2. 既然每个指针变量所占用的内存空间是一样的,而且存储的都是地址,那为什么指针变量还要份类型?而且只能指向一种类型的变量?比如指向int类型的指针、指向char类型的指针。
这个就跟在不同编译器下不同类型的数据所占的内存不同有关了,如int类型在64位编译器下占4个字节,char类型占1个字节,那么int类型的地址则是4个不同字节地址中的低位地址,而char类型只占一个字节,如果我们用int类型的指针变量指向char类型的地址,那么int类型的指针就会从char类型的地址往上读取3个字节的数据,但我们不知道另外3个字节存储的内容,所有取出来的值是不准确的。
|