首先要知道不管你的指针是什么类型,是几级指针,在同一个操作平台编译环境中,所占的内存空间都是一致的。如pc使用的是32位的,那就是 32/8=4,那就是4个字节内存空间。
例:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i = 1;
int *p = &i;//分开写是 int *p;p=&i;
printf("i = %d\n",i);//简单取值
printf("&i = %p\n",&i);//取出 i对应的地址
printf("p = %p\n",p); //p存储的是一个地址,这个地址是&i。
printf("&p = %p\n",&p);//p自己也有一个地址
printf("*p = %d\n",*p);//相当于在p的存储的地址中取值,而p的存储的地址是&i对应的地
//址,在这个地址里取值,就是i的值。
return 0;
}
解释:通俗点说,i变量是在内存有地址的,这个地址比如说0x2000,实际上对应我的电脑是0x7fff1035aedc,在图上可以看见;而这个i的变量对应的值是1。而指针p是存储i这个变量对应的地址,因为指针是负责存地址的,由上式 int *p = &i可知道,但是p这个指针自己也在内存也存有一块地址,比如说是0x3000,那么这个是指针自身的地址,&p=0x3000。上述是一级指针。二级指针继续往下看,
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i = 1;
int *p = &i;//分开写是 int *p;p=&i;
int **q =&p;
printf("i = %d\n",i);//简单取值
printf("&i = %p\n",&i);//取出 i对应的地址
printf("p = %p\n",p); //p存储的是一个地址,这个地址是&i。
printf("&p = %p\n",&p);//p自己也有一个地址
printf("*p = %d\n",*p);//相当于在p的存储的地址中取值,而p的存储的地址是&i对应的地
//址,在这个地址里取值,就是i的值。
printf("q = %p\n",q);
printf("&q = %p\n",&q);
printf("*q = %p\n",*q);
printf("**q = %d\n",**q);
return 0;
}
说到指针,我们也不能忘记了还有两个指针,一个是空指针,一个是野指针。
空指针:一开始不知道这个指针要具体存放啥时,就先将其设为空指针,常见为NULL。
野指针:当前这个指针所指向的空间是不确定的,但还需要使用。
例:
#include "stdio.h"
#include "stdlib.h"
int main()
{
int *p = NULL;//空指针
int *q;//野指针
return 0;
}
接下里是指针与数组的关系
例:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a[3] = {1,2,3};
int i;
int *p = a;
for(i = 0;i < sizeof(a)/sizeof(a[0]);i++)//sizeof a 表示是整个数组占据的大小,sizeof a0 表示是第一占据大小 相除可以得到具体多少块
{
printf("%p-->%d\n",&a[i],a[i]);
printf("%p-->%d\n",a+i,a[i]);
printf("%p-->%d\n",p+i,a[i]);
printf("%p-->%d\n",p+i,*(p+i));
}
return 0;
}
潇洒的结论:
a[i]可表示 a[i] = *(a+i) = *(p+i) = p[i]
&a[i]可表示 &a[i] = a+i = p+i = &p[i]
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a[3];
int i;
int *p = a;
for(i = 0;i < sizeof(a)/sizeof(*a);i++)
printf("%p-->%d\n",&a[i],a[i]);
for(i = 0;i < sizeof(a)/sizeof(*a);i++)
scanf("%d",p++);
//scanf("%d",&a[i]);
//scanf("%d",&p[i]);
p = a;//将自增完的地址重新赋值
for(i = 0;i < sizeof(a)/sizeof(*a);i++,p++)
printf("%p-->%d\n",p,*p);
printf("/n");
exit(0);
}
来一个指针运算
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a[6] = {5,1,7,3,8,3};
int y;
int *p = &a[1];
y = (*--p)++;//在p地址的基础上地址自减一个元素,所以y的值为a[0]=5
//在执行完取值的操作后,a[0]所存放的值自增1
printf("y = %d\n",y);
printf("a[0] = %d\n",a[0]);
exit(0);
}