存放内存单元的地址,该地址被形象的称为指针,存放在指针中的值都被当成地址处理。而指针变量就是一个存放地址的变量。与普通的变量相同把它看做一个新的类型就好。数组
在32位平台下,有32根地址线,有2^32个排列组合,所以可编2^32(4G)个地址。编址的最小单位是字节。
因为int变量占四个字节,取地址取最低地址表示。(double、long同理)。
在32位机器上,地址是32个0或1组成的二进制序列,(32/8)那地址就得用4个字节空间来存储,因此一个指针变量的大小就应该是4个字节。
同理在64位机器上,有64根地址线,(64/8)于是地址要用8个字节空间来存储。ide
type+ * (二级指针:int **,type是int*)。type*****类型的指针是为了存放某类型变量的地址。指针
指针的类型决定了指针向前或向后走一步有多大距离:加减上所指向类型占字节的大小。于是加1或减一是令指针指向了下或上一个一个变量、数组、结构体。。。。
看下面例子:code
int n = 10; int *pi = &n; char *pc = (char *)&n; printf("%p\n", pi); ---> 00D8F9D0 printf("%p\n", pi+1); --->00D8F9D4 printf("%p\n", pc); --->00D8F9D0 printf("%p\n", pc+1); --->00D8F9D1
答案符合正如咱们解释的那样
ps:二级指针、三级指针..他们指向的类型都是指针类型,因此加一或减一都会加或减4个字节。(指针所占空间大小为4B)blog
指针的类型决定了,对指针解引用的时候有多大权限(能访问几个字节),例如:char* 指针解引用就只能访问一个字节,而int*的指针就可以访问4个字节。内存
int n = 0x11223344; int* pi = &n; char* pc = (char*)&n; //解引用只能指向一个空间 *pc=0x55; printf("%x\n", n); --->11223355 *pi = 0; printf("%x\n", n); --->0
表明两个指针之间经历的元素。
eg:it
int a[10]; int *p=&a[0]; int *q =&a[9]; 则:p-q=9不是(4*9=36) 若 char *p=(char*)&a[0]; char *q =(char *)&a[9]; p-q=36; //元素个数由指针指向类型决定。
标准规定:容许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,可是不容许与指向第一个元素以前的那个内存位置的指针比较。
对比:class
for(vp=&values[N_values];vp>&values[0];) //比较都是合法的 { *--vp=0; } for(vp=&values[N_values-1];vp>=&values[0];vp--) //vp=-1时比较后不成立而后才退出循环! { *vp=0; }
存放一级指针地址的变量。
由于指针也是变量,既然是变量,那他也确定有地址,有地址,因此也能够被保存起来,保存一级指针地址的空间,就是二级指针。
其关系表示基础
二者本质上没有什么关系!
数组名与数组地址及数组首元素的关系:数组地址与数组首元素地址在数值上相等。但意义上不一样。(数组地址加一加过了整个数组,而首元素地址加一只加过了一个元素)
数组名在取地址符号后,及在sizeof中单独使用时表明整个数组,剩下的情景都表示数组中首元素地址。
数组表示中 数组名称【元素下标】=*(数组名称+元素下标) 此处的数组名称表示首元素地址。变量
我的心得:指针就是一个存放地址的变量,二级指针也是个变量,三级四级都是,因此不要总把指针看做个例。
数组和指针没有什么关系,只是在某些表达形式上,有不少相同之处。
一个数组,里面存放元素的类型都是某类型指针,数组内每一个空间都存放一个地址,指向某内存空间。
int* arr1[10]; //×××指针的数组 char* arr2[4]; //一级字符指针的数组 char** arr3[4];//二级字符指针的数组