存放内存单元的地址,该地址被形象的称为指针,存放在指针中的值都被当成地址处理。而指针变量就是一个存放地址的变量。与普通的变量相同把它看作一个新的类型就好。
在32位平台下,有32根地址线,有2^32个排列组合,因此可编2^32(4G)个地址。编址的最小单位是字节。
由于int变量占四个字节,取地址取最低地址表示。(double、long同理)。
在32位机器上,地址是32个0或1组成的二进制序列,(32/8)那地址就得用4个字节空间来存储,所以一个指针变量的大小就应该是4个字节。
同理在64位机器上,有64根地址线,(64/8)因而地址要用8个字节空间来存储。
type+ * (二级指针:int **,type是int*)。type*****类型的指针是为了存放某类型变量的地址。
指针的类型决定了指针向前或向后走一步有多大距离:加减上所指向类型占字节的大小。因而加1或减一是令指针指向了下或上一个一个变量、数组、结构体。。。。
看下面例子:
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)
指针的类型决定了,对指针解引用的时候有多大权限(能访问几个字节),例如: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:
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; //元素个数由指针指向类型决定。
标准规定:允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针比较。
对比:
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];//二级字符指针的数组
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。