指针
指针就是变量,用来存放地址的变量。
#include<stdio.h>
int main ()
{
int a=10;//现在内存中开辟一块空间
int *p=&a;//这里我们对变量a,取出它的地址,可以使用&操作符.
//将a的地址存放在p变量中,p就是一个指针变量。
return 0;
}
指针的大小
指针在32位的平台上的大小是4个字节,在64为平台上的大小是8个字节。
#include<stdio.h>
#include<windows.h>
int main()
{
int a = 0;
int *q = a;
printf("%d\n", sizeof(*q));//4
system("pause");
return 0;
}
指针的类型
变量有不同的类型,指针同样有不同的类型,在定义指针的时候用"type+ * "的方式来定义指针的,如"char *"类型的指针就是为了存放char类型的变量的地址。“int *”类型就是为了存放int类型的变量地址,等等。
char *p1=NULL;
int *p2=NULL;
int *p3=NULL;
long *p3=NULL;
float *p4=NULL;
double *p5=NULL;
指针±整数
指针的类型决定了指针向前或者向后走一步有多大(距离)。
#include<stdio.h>
int main()
{
int n = 10;
char *pc = (char*)&n;
int *pi = &n;
printf("%p\n",&n);//00E3FA44
printf("%p\n",pc );//00E3FA44
printf("%p\n",pc+1 );//00E3FA45(pc为char类型)
printf("%p\n",pi );//00E3FA44
printf("%p\n",pi+1 );//00E3FA48(pi为int类型)
system("pause");
return 0;
}
指针的解引用
指针的类型决定了,对指针解引用的时候有多的的权限(能操作几个字节)。例如:char的指针解引用就只能访问一个字节,而int的指针就能访问4个字节。
#include<stdio.h>
int main()
{
int n = 0x11223344;
char *pc = (char *)&n;
char *pi = &n;
*pc = 0x55;//重点在调试的过程观察内存的变化
*pi = 0;//重点在调试的过程观察内存的变化
return 0;
}
二级指针
指针变量也是变量,是变量就有地址。那么存放指针变量地址的变量就是二级指针。
指针和数组
可以把数组名当成地址存放在一个指针中,那么用指针就可以访问一个数组。
#include<stdio.h>
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
int *p = arr;//将数组首元素地址存入指针
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;;
for (; i < sz; i++)
{
printf("%2d",*(p+i));
}
system("pause");
return 0;
}
指针数组
顾名思义指针数组是数组,只不过指针数组中的每一个元素都存放的指针。