一、指针是什么?
通俗的讲,指针就是地址,我们通常所说的指针其实是指针变量,也就是保持地址的变量。
下面用一段代码展示,更加通俗易懂:
#include<stdio.h>
int main()
{
int i = 5; //定义整型变量i
char c = 'a';//定义字符型变量c
int *i_p = &i; //定义整形指针变量i_p,并初始化
char *c_p; //定义字符型指针变量c_p
return 0;
}
指针分不同类型,是因为取值可以拿到的空间大小不同
例如: *i_p 可以拿到4个字节大小的空间,而 *c_p只能拿到1个字节大小的空间
二、间接访问
i_p指针变量中存储的内容是i的地址(起始地址),c_p指针变量中存的内容是c的地址,我们可以把指针变量理解为“藏宝图”,通过间接访问可以帮助我们找到“宝藏”(变量)。
#include<stdio.h>
int main()
{
int i = 5; //定义整型变量i
char c = 'a';//定义字符型变量c
int *i_p = &i; //定义整形指针变量i_p,并初始化
char *c_p; //定义字符型指针变量c_p
c_p = &c; //变量c的地址赋值给c_p
*i_p = 10; //通过“间接访问”修改变量i的值
printf("i=%d\n",i); //输出i的值
return 0;
}
为什么要做间接访问呢,为什么不直接i=10就好了﹖我们在下一小节中为大家揭晓谜底。
三、指针变量的大小
int i=5; //定义整型变量i
char c ='a'; //定义字符型变量c
int *i_p=&i;
char *c_p=&c;
指针变量本身的大小是固定的,对于64位系统,sizeof(i_p)和sizeof(c_p)都是8个字节,对于32位系统,sizeof(i_p)和sizeof(c_p)都算4个字节。
sizeof(*i_p)是4个字节,和sizeof(i)等价,可以理解为 操作 *i_p 就是操作 i ;
sizeof(*c_p)是1个字节,和sizof(c)等价,可以理解为 操作 *c_p 就是操作 c 。
四、注意事项
1、指针变量定义方式
int *a 和int* a 是等价的,为什么大家都用int *a呢?
这是因为类似 int* abc 的语句会使人很自然的认为这条语句把三个变量都声明为整型指针,但是事实并非如此,“ * ” 实际上是 *a 的一部分,只是对a标识符起作用,其余两个变量只是普通的“整型变量”。
要声明三个指针变量,正确语句如下:
int *a,*b,*c;
2、 注意下面写法(毫无意义而且会出错)
float a;
int *p;
p=&a;