一个关于C语言指针的测试
2012-08-13 14:06
218 查看
前几天有个同学让我帮他看一道关于指针的二级题。当时虽然做出来了,但感觉对概念还是有点模糊,所以刚刚就做了一个小测试。
测试代码是这样的:
测试结果是这样的:
观察结果会发现:
t和*t的值是一样的,但是*(t+1)和(*t)+1 的值却是不一样的。
而且(*t)+1的地址就是&t[0][1] 而*(t+1)的地址就是&t[1][0]。
为什么会这样呢??
首先要明确一点:t的值与&t[0][0],&t[0]和t[0]是相等的。他们都表示数组的首地址。
你可能会问为什么t[0]和t为什么相等,其实你用偏移量就能算出他们是相等了的。(另外注意它们两个都是地址值)
其实t数组是一个二维指针,它的数组名相当于一和行指针的指针数组是首地址,这样说有点绕口,
简单点说可以这样,t[3][3],本身相当于是3个一维数组,t[0],t[1],t[2],分别是三个一维数组。
显然t就是这三个数组的首地址了,很显然t+1的结果就应该是t[1]的地址,t+2就应该是t[2]的地址。
说这么多只是想让大家能更加清楚二维指针的+和 -运算的操作。
而*t这时候也就应该是t[0]了,t也是&t[0]的地址。所以他们是相等的。
但是*(t+1)与(*t)+1是不同的。因为t是一个二维指针,t+1就是t[1]的地址,*(t+1)就是&t[1][0],也就是数组中第4个元素4的地址了。
而(*t)+1中(*t)得到了t[0],注意此时t已经从一个二维指针退化到了一个一维指针了,这是对它+1,就自然是&t[0][1]了。
所以答案就自然而然了。
最后总结一下:
在指针经行运算的时候,主要要弄清指针到底是一维指针还是二维指针。如果是一维指针,那么它的偏移量就应该是1个基本元素的位移,
如果是二维指针,就应该是一行元素的位移,因为二维指针的相当于由一维数组指针组成的数组。
测试代码是这样的:
#include <iostream> #include <cstdio> using namespace std; int main(void) { int t[3][3]={1,2,3,4,5,6,7,8,9}; cout<<"t的结果: "<<t<<endl; cout<<"*t的结果: "<<*t<<endl; cout<<"(*t)+1的结果: "<<*t+1<<endl; cout<<"(t+1)的结果: "<<(t+1)<<endl; cout<<"*(t+1)的结果: "<<*(t+1)<<endl; cout<<"**(t+1)的结果:"<<**(t+1)<<endl; cout<<"&t[0][1]的结果:"<<&t[0][1]<<endl; cout<<"&t[1][0]的结果:"<<&t[1][0]<<endl; system("pause"); return 0; }
测试结果是这样的:
观察结果会发现:
t和*t的值是一样的,但是*(t+1)和(*t)+1 的值却是不一样的。
而且(*t)+1的地址就是&t[0][1] 而*(t+1)的地址就是&t[1][0]。
为什么会这样呢??
首先要明确一点:t的值与&t[0][0],&t[0]和t[0]是相等的。他们都表示数组的首地址。
你可能会问为什么t[0]和t为什么相等,其实你用偏移量就能算出他们是相等了的。(另外注意它们两个都是地址值)
其实t数组是一个二维指针,它的数组名相当于一和行指针的指针数组是首地址,这样说有点绕口,
简单点说可以这样,t[3][3],本身相当于是3个一维数组,t[0],t[1],t[2],分别是三个一维数组。
显然t就是这三个数组的首地址了,很显然t+1的结果就应该是t[1]的地址,t+2就应该是t[2]的地址。
说这么多只是想让大家能更加清楚二维指针的+和 -运算的操作。
而*t这时候也就应该是t[0]了,t也是&t[0]的地址。所以他们是相等的。
但是*(t+1)与(*t)+1是不同的。因为t是一个二维指针,t+1就是t[1]的地址,*(t+1)就是&t[1][0],也就是数组中第4个元素4的地址了。
而(*t)+1中(*t)得到了t[0],注意此时t已经从一个二维指针退化到了一个一维指针了,这是对它+1,就自然是&t[0][1]了。
所以答案就自然而然了。
最后总结一下:
在指针经行运算的时候,主要要弄清指针到底是一维指针还是二维指针。如果是一维指针,那么它的偏移量就应该是1个基本元素的位移,
如果是二维指针,就应该是一行元素的位移,因为二维指针的相当于由一维数组指针组成的数组。
相关文章推荐
- C语言结构体里的成员数组和指针(C语言的一个隐晦角落——关于零数组)
- C语言中关于指针,二维数组等的问题,一个有趣的发现
- 关于二级指针的使用测试小例子,仅供测试--参数传递的时候用指针最好,因为压栈的时候指针,只是压入一个地址的值,最多4个字节(32位机上),提供的3个测试例子,基于VC6.0的环境。
- 关于一个C语言的笔试题(数组+指针)
- C语言中的一个关于基本类型的输出问题
- 关于C语言中内嵌汇编指令的一个小细节
- [C语言]关于指针和int型的一道题目
- 关于数组与指针的一个小问题
- C语言中的一个关于求正方形个数的算法题目
- C语言---关于char型数组和char型指针的问题
- 关于上一个sql优化测试的部分知识
- 关于C语言中的数组指针、指针数组以及二级指针
- 推荐一个pdf,关于c指针的
- 关于孙鑫MFC视频第三章中this指针指向基类还是派生类的测试程序
- 关于C语言的二维数组和指针注意的地方
- 关于搭建一个高性能网站的服务器的架设思路以及nginx测试的并发
- 一个关于C语言单链表的简单应用程序
- 关于C语言中返回局部指针变量
- 关于C++指针的一个问题
- 关于C语言指针【第二季】