说实话你真真的把指针搞懂了吗?指针到底是什么?指针变量又是什么?地址又是什么?二级指针又是什么?三级、四级呢 ?这些到底是什么关系?
- 当你看到这些东西的时候你又做何感想?天啊,我感觉不管在生活中还是在学业上只要你遇到什么难题没有将它解决掉,而且你没有把它搞清楚或者将难点克服。那么它会不停的找你的麻烦。只有你将这个难题解决掉了,你才不会再受到它的干扰,就算遇到它你也能坦然对待。
首先来看这个例题,到底是怎么回事?
- 例题一
#include<stdio.h>
#include<windows.h>
int main(){
char arr[] = "abcdefghijklmn";
char *p = arr;
int count = 0;
while (*p != '\0'){
count++;
p++;
}
printf("count=%d\n",count);
system("pause");
return 0;
}
//模拟实现strlen函数,其特点是以遇到的第一个'\0'为结束标志,将之前的字符数计入到字符串长度内
//其中字符串的名字代表的是字符串的首地址既arr[0]的地址(&arr[0])
下图为个人理解的指针知识,图中的红色方框表示的是指针变量p,其内部存储的是该指针所指向的内存地址&arr[0].
另外一个红色方框表示的是数组首元素的地址(&arr[0])而其内部储存的是字符a .
上述程序的监视结果如图
由图可以看出,数组名arr、&arr[0]与指针变量p都指向同一个地址(0x009dfa48)
而指针变量p解引用(既*p)与arr[0]的值是相同的都为ASCII值97 ---->’a’
- 例题二
#include<stdio.h>
#include<windows.h>
int main(){
int a = 100;
int *p =&a;
int **q = &p;
printf("a=%d\n",a);
printf("*p=%d\n", *p);
printf("**q=%d\n", **q);
system("pause");
return 0;
}
//&a=p,*p=a=100;p为指针变量,其内部存储的是a的地址。
//&p=q,*q=&a=p,**q=a=100;
下图简单的讲解了一下整形变量与指针变量的关系以及解引用的实质。
程序调试过程中的监视结果如下(可以验证我的理解)
由图可以看出**q=*p=a=100
而指针变量 p 中存储的内容与二级指针变量 q 解引用存储的内容即为整形变量a的地址(&a=0x00effce0)
而二级指针变量 q 中存储的内容即为指针变量 p 的地址(&p=0x00effcd4).
指针变量的值并非它所指向的内存储存的值,我们必须使用间接访问获取它所指向位置存储的值
- 变量与内部的内容
变量 | 变量内部存储的值 |
---|---|
a | 100 |
p | &a |
q | &p |
- 变量解引用后的结果
变量 | 解引用后的结果 |
---|---|
* p | a=100 |
*q | &p |
**q | a=100 |
-
N级指针粗略讲解
-
一级指针存储的是变量(int\char\float等类型的变量)的地址
-
二级指针中存储的是一级指针变量的地址
-
三级指针中存储的是二级指针变量的地址
。。。。 -
n级指针中存储是(n-1)级指针变量的地址(n>1)
左值与右值的简单介绍
左值意味着一个位置,而右值意味着一个值。所以使用右值的地方可以使用左值,而在需要使用左值的地方不能使用右值