目录
指针
一、指针是什么?
指针是什么?
指针理解的2个要点:
1.指针是内存中一个最小单元的编号,也就是地址。
2.平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量
总结:指针就是地址,口语中说的指针通常指的是指针变量。
3.指针变量
我们可以通过&(取地址操作符)取出变量的内存其实地址,把地址可以存放到一个变量中,这个变量就是指针变量。
#include <stdio.h>
int main()
{
int a = 10;//在内存中开辟一块空间
int *p = &a;//这里我们对变量a,取出它的地址,可以使用&操作符。
//a变量占用4个字节的空间,这里是将a的4个字节的第一个字节的地址存放在p变量
中,p就是一个之指针变量。
return 0;
}
总结:
指针是用来存放地址的,地址是唯一标示一块地址空间的。
指针的大小在32位平台是4个字节,在64位平台是8个字节。
二、指针类型,指针所指类型,指针的值
1.指针类型
从语法角度看,把指针声明语句里面的指针变量的名字去掉,剩下的就是指针的类型。
char *pc = NULL; //指针的类型是char*
int *pi = NULL; //指针的类型是int*
float *pf = NULL; //指针的类型是float*
double *pd = NULL; //指针的类型是double*
int **pc=NULL; //指针类型是int**
int (*par)[3]; //指针类型是int (*)[3]
int *(*par)[4]; //指针类型是int *(*)[4]
这里可以看到,指针的定义方式是: type + * 。
其实:
char* 类型的指针是为了存放 char 类型变量的地址。
short* 类型的指针是为了存放 short 类型变量的地址。
int* 类型的指针是为了存放 int 类型变量的地址。
2.指针所指类型
从语法角度看,就是把指针声明语句中的指针变量的名字和名字左边的指针声明符*去掉,剩下的就是指针所指的类型了。
char *pc = NULL; //指针所指的类型是char
int *pi = NULL; //指针所指的类型是int
float *pf = NULL; //指针所指的类型是float
double *pd = NULL; //指针所指的类型是double
int **pc=NULL; //指针所指的类型是int*
int (*par)[3]; //指针所指的类型是int ()[3]
int *(*par)[4]; //指针做值得类型是int *()[4]
3.指针的值
指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个一般的数值。我们说一个指针的值是XX,就相当于说该指针指向了以XX 为首地址的一片内存区域;我们说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。
三、指针的算术运算
1.指针±整数
#include <stdio.h>
//演示实例
int main()
{
int n = 10;
char *pc = (char*)&n;
int *pi = &n;
printf("%p\n", &n);
printf("%p\n", pc);
printf("%p\n", pc+1);
printf("%p\n", pi);
printf("%p\n", pi+1);
return 0;
}
总结:指针的类型决定了指针向前或者向后走一步有多大(距离)。
2.指针-指针
代码如下(示例):
int main()
{
int arr[10] = { 0 };
//取出数组第一个元素和最后一个元素的地址
int* start = arr;
int* end = &arr[9];
printf("%d\n", end - start);
return 0;
}
总结:指针-指针得到的是差的元素的个数。(例子中的10-1=9个元素)
四、运算符&和*
&是取地址运算符,*是间接运算符
int a=10; int*p; int **ptr;
p=&a; //&a的结果是一个地址,类型是一个指针,指针类型是int*,只想的是int,指向的是a的地址
ptr=&p; //&p 的结果是个指针,该指针的类型是p*,
**ptr=4; //*ptr的结果是一个指针
五、指针与数组的关系
1.指针数组
1.指针数组:存放指针的数组就是指针数组
int main()
{
int a = 10;
int b = 20;
int c = 30;
/*int* pa = &a;
int* pb = &b;
int* pc = &c;*/
int* parr[10] = { &a,&b,&c }; //指针数组
int i = 0;
for (i = 0; i < 3; i++)
{
printf("%d ", *(parr[i]));
}
2.数组指针
int *p1[10];
int (*p2)[10];
//p1, p2分别是什么?
解释:
int (p)[10];p先和结合,说明p是一个指针变量,然后指着指向的是一个大小为10个整型的数组。所以p是一个
指针,指向一个数组,叫数组指针。
//这里要注意:[]的优先级要高于号的,所以必须加上()来保证p先和结合。