1、指针:指向一个内存地址,即存储一个地址。
在讲指针之前我们要弄懂几个概念:内存地址,内存数据,指针变量。
内存地址:内存是一个存放数据的地方,既然要存放数据,那么就要地址,只有这样才能做到管理数据的存取。
内存地址便是为了管理数据的存取,无序的存放数据便会无法正确取出数据。
内存数据:内存数据便是存放在内存地址上的数据,一段地址映射一段数据。那么在内存的存在地址-数据对
(当然内存的管理和存取是非常复杂的,这只是简单描述)
指针变量:指在一个地址(地址)上存放另一个地址(数据)。这样我们就可以通过地址(地址)上的地址(数据),找到这个地址(数据)上的数据。
举个栗子:int a = 10; int *p = &a
_________________________________________________________________
地址: | 0xFF1004 | ........... | 0xFF2004 | ...................
数据: | 10 |............ | 0xFF1004 | ..................
__________________________________________________________________
分析:地址0xFF1004存放着数据整数10,而在地址0xFF2004存放着地址0xFF1004。那么声明的变量a和p是什么?(a和p只是数据的别名)
那么符号*和&是什么?(*声明指针或指针取值,&取址运算)
栗子:
1 #include <stdio.h> 2 3 int main() 4 { 5 int a = 10; 6 int *p = &a; 7 8 printf("%d\n", a); 9 printf("%d\n", &a); 10 printf("%d\n", p); 11 printf("%d\n", *p); 12 printf("%d\n", &p); 13 14 return 0; 15 } 16 17 /* 18 输出: 19 10 20 309454652 21 309454652 22 10 23 309454640 24 */
2、指针与数组
指针:int *p = (int *)malloc(9 * sizeof(int))
1)可以通过malloc动态分配内存,如果数据过长,超过分配的内存的时会动态增加内存进行存放。上面的例子意思是给p分配存放9个int类型的数据的内存大小。
2)指针p指向的是数据的首地址。
3)可以通过指针的移动和下标的方式来存取地址
数组:int a[10];
1)要在声明的时候指定内存大小,固定内存分配。
2)数组名a存放的是第一个元素的地址,即是首地址。
3)通过下标的方式赋值。