C语言—指针总结
一.指针是什么
1.指针是变量,存放的是内存单元的地址(编号)(指针也可以放指针变量),存放在指针里的值都被当成地址处理,(指针占4个字节,32个比特位);
指针详解:指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电 脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将 地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。
2.地址范围:(32个0~32个1)故共2的32次方个地址
要明白:①在32位的机器上,地址是32个0或者1组成二进制序列,那地址就得用4个字节的空间来存储,所以一个指针变 量的大小就应该是4个字节。
②那如果在64位机器上,如果有64个地址线,那一个指针变量的大小是8个字节,才能存放一个地址。
二.指针和指针类型
1.指针也有类型:int num = 10;
p = #(要将&num(num的地址)保存到p中)
例:char *pc = NULL;
int pi = NULL;
short ps = NULL;
long pl = NULL;
float pf = NULL;
double pd = NULL;
(指针的定义方式是: type + * 。 其实: char 类型的指针是为了存放 char 类型变量的地址。 short 类型的指针是为了存放 short 类型变量的地址。 int 类型的指针是为了存放 int 类型变量的地址)
2.指针+ -整数
[指针+1,看起来是+1,其实是加上其所指向类型的大小]
(每次运行的地址不固定,随机,道理一样)
【总结】: 指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)。 比如: char 的指针解引用就 只能访问一个字节,而 int 的指针的解引用就能访问四个字节。
3.指针的解引用
4.指针-指针
两指针相减的结果代表的是p,q间的元素的个数
代表整个数组:① sizeof[数组名];
② &数组名;
元素的类型由指针类型决定!
同理可得:
5.指针和数组:两者没有关系
数组名表示的是数组首元素的地址!
int arr[10] = {1,2,3,4,5,6,7,8,9,0};
int *p = arr;//p存放的是数组首元素的地址
所以 p+i 其实计算的是数组 arr 下标为i的地址,那我们就可以直接通过指针来访问数组。
三.二级指针
1.二级指针:指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪里? 这就是二级指针
int a=10; a的地址存放在pa中, pa的地址存放在ppa中, pa 是int *pa=&a; 一级指针,而ppa是二级指针。
int **ppa=&pa;
*ppa 通过对ppa中的地址进行解引用,这样找到的是 pa , *ppa 其实访问的就是 pa .
**ppa 先通过 *ppa 找到 pa ,然后对 pa 进行解引用操作: pa ,那找到的是 a
2.指针数组:是数组,是存放指针的数组
【数组(是一种类型)指针是指针。】
int arr3[5];【指针数组】
Int (*arr3)[5];【数组指针】
是指针还是数组由操作符的优先级决定,先和谁结合就是谁!