二维数组地址计算等问题

#include"stdafx.h"#include<iostream>usingnamespacestd;int_tmain(intargc,_TCHAR*argv[]... #include "stdafx.h"
#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
char strp[] = "a\t\n\0aa\0";
cout<<"size of "<<sizeof(strp)<<" strlen is "<<strlen(strp)<<endl;

int a[5][10];
cout<<"\n\n\n\n";
cout<<"\n &a[5] - &a[0] is "<<&a[5] - &a[0]<<"\n &a[3][1] - &a[1][3] is "<<&a[3][1] - &a[1][3];
cout<<"&a[0] is "<<&a[0]<<" &a[1] is "<<&a[1]<<" &a[2] is"<<&a[2]<<endl;
cout<<"&a[0][0] is "<<&a[0][0]<<" &a[0][1]is "<<&a[0][1]<<" &a[0][2] is"<<&a[0][2]<<endl;
cout<<"&a[1][0] is "<<&a[1][0]<<" &a[1][1]is "<<&a[1][1]<<" &a[0][2] is"<<&a[1][2]<<endl;
cout<<"&a[1][0] - &a[0][0] is "<<&a[1][0] - &a[0][0]<<endl;
cout<<"&a[1] - &a[0] is "<<&a[1] - &a[0]<<endl;
cout<<"&a[1] is "<<&a[1]<<" &a[0] is "<<&a[0]<<endl;
cout<<"\n\n\n\n";
char *abc = "123456789";
cout<<"\n\nshort* "<<*(short*)(abc + 4)<<" short all is "<<*(short*)abc;

getchar();
return 0;
}

output:

size of 8 strlen is 3

&a[5] - &a[0] is 5
&a[3][1] - &a[1][3] is 18&a[0] is 0012FE88 &a[1] is 0012FEB0 &a[2] is0012FED8
&a[0][0] is 0012FE88 &a[0][1]is 0012FE8C &a[0][2] is0012FE90
&a[1][0] is 0012FEB0 &a[1][1]is 0012FEB4 &a[0][2] is0012FEB8
&a[1][0] - &a[0][0] is 10
&a[1] - &a[0] is 1
&a[1] is 0012FEB0 &a[0] is 0012FE88

short* 13877 short all is 12849

有几个问题不懂,请教高手:

1.char strp[] = "a\t\n\0aa\0";\\strlen is 3
strlen遇到\0就停止计算个数,但为什么不管它之后的字符呢?
strp已有\0结尾,为什么计算时还要加一?

2. &a[5] - &a[0] is 5
&a[1] is 0012FEB0 &a[0] is 0012FE88
为什么相减结果是5?根据打印出来的地址计算不是5啊.
&a[1][0] - &a[0][0] is 10 这又为什么是10?

3.
char *abc = "123456789";
cout<<"\n\nshort* "<<*(short*)(abc + 4)<<" short all is "<<*(short*)abc;
\\short* 13877 short all is 12849
short那个转换完全不懂:(
非常感谢你详细的解答,但第3个我还是不懂.abc+4不是指到56789吗?为什么是0x3635?当char弄存储时需要考虑little endian吗?为什么?
展开
 我来答
Eli2021
2010-06-03 · TA获得超过664个赞
知道小有建树答主
回答量:1266
采纳率:72%
帮助的人:338万
展开全部
1. strlen函数就是这样设计的,遇到\0就停止计算个数,这没有为什么,c语言标准的制定者就是要这样设计。其实也是可以理解的,如果不是遇到\0就停止计算,那还真的没法实现这个函数。
char strp[] = "xxx" 这种写法,没有谁规定编译器要去检查你的字符串最后一个字符是不是\0来决定数组的大小,这种情况的处理都是机械的:数组的内容是你引号中的内容再加一个\0;

2. 指针的加减不要理解为地址的加减。指针加减是有“单位”的,单位大小是指针类型的大小。例如,int型指针,加减的“单位”是sizeof(int),也就是4.
比如,int *p = 0x00000001; 那么p=p+2;这时p不是0x00000003,而是0x00000009,也就是指针加2实际地址要加2*4.

3.指针类型的转换
char*转成shor*,这时指针所指向的空间被当前shot类型来解释。
(short*)(abc + 4) 这个地址所指的空间的数据为0x3635,即字符65的ascii码。转成十进制就是13877,后面那个同理。

对于第3点,我再补充一下:
abc+4指向56789没错,但内存中保存的是字符的ascii码,所以,abc+4所指向的内存各个字节依次(按地址从小到大)是字符5 6 7 8 9的ascii码,即0x35 0x36 0x37 0x38 0x39。 将abc+4转成short*类型后,就只解释两个字节(short的大小是2字节)了,也就是0x35 和 0x36,但由于x86系统是小端模式,所以abc+4指向的内存当作shor解释就应该是0x3635。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式