C/C++ 您当前所在位置:首页 > C/C++ > C语言指针探测(三)
C语言指针探测(三)
简介 指针在C中是一个至高点,如果指针没学好,那么C就相当于白学。我这里将学习笔记记录下来,一步一步了解指针到底是个什么东西,如何使用。
地址符(&)
任何变量都可以在前面加上一个&来获取该变量的地址,但常量不可以。如:
int main(int argc, char* argv[]) { char a = 10; char* pa = &a; return 0; }
定义一个a变量,然后再取出地址放到pa变量中,注意通过“&”符号返回的结果类型为当前变量类型再加一个“*”。所以char类型获取地址后类型就是char*,int类型获取地址后类型是int*,包括本身就带有“*”的类型,如:int*类型的变量,获取地址后类型就是int**。
求带“*”类型的值
int main(int argc, char* argv[]) { int* a = 10; int** b = 20; //取值 int x = *a; int* y = *b; return 0; }
上面取变量a和b的值,通过在变量前面加一个“*”,其结果的类型就是该变量本身的类型去掉一个“*”。所以后面变量x和y的类型都分别少了一个“*”,这个和地址符(&)是相反的。结合C语言指针探测(一)和C语言指针探测(二)中来看,很容易绕晕,啥玩意儿啊,一会儿去“*”,一会儿加“*”。其实也没那么难,用心理解理解就好了。
还有一点要说明,如果一个变量类型本身不带“*”,是不能在变量前面加“*”来取值的。
那*a这种语法到底是干嘛呢?
int main(int argc, char* argv[]) { int a = 10; int* pa = &a; //注意下面 int a1 = *pa; return 0; }
执行代码看看反汇编。
00401028 mov dword ptr [ebp-4],0Ah
0040102F lea eax,[ebp-4]
00401032 mov dword ptr [ebp-8],eax
00401035 mov ecx,dword ptr [ebp-8]
00401038 mov edx,dword ptr [ecx]
0040103A mov dword ptr [ebp-0Ch],edx
前三行好理解,将10放在第一个局部变量,再将第一个局部变量的地址放在第二个局部变量。从第四行开始,首先将第二个局部变量的值放在ecx,这个时候ecx的值其实就是变量a的地址。然后第5行将这个值当成地址再去将这个地址的值放在edx,最后放到第三个局部变量中。一句话就是不直接将变量的值取出,而是将变量的值当成地址再去取一次值。
最后我们用“*”来循环打印一个数组练习一下。
int main(int argc, char* argv[]) { int arr[6] = {1,2,3,4,5,6}; //将数组第一个变量地址取出,也就是数组首地址 //int* px = &arr[0]; //上面的写法还有一个简写形式,一样,将数组首地址放到px变量中 int* px = arr; for(int i = 0; i < 6; i++) { printf("%x\n", *(px+i)); } return 0; }
通过带“*”类型的变量(px)加上一个数(i)用“*”来取值 ,这里就用到了前面记录的带“*”类型加上一个整数。
上一篇: 关闭网站响应头中PHP版本信息
下一篇: 宏的定义与说明
猜你喜欢
点击排行
热门推荐
随机展示
站点信息
- 上线时间:2020年05月30日
- 网站程序:自建框架
- 博客模板:今夕何夕
- 文章统计:43篇文章
- 评论统计:0条评论
- 留言统计:0条留言
- 统计数据:百度统计