关于c语言指针的一些问题。

问题1:一个指针是4个字节(教程中说是32根地址线),那我如果我的操作系统是64位的呢。那么一个指针有多少个字节?
问题2:地址线和操作系统的位数有关系吗
问题3:
len = 5 ;
int * pArr = (int *)malloc(sizeof(int) * len);
上面代码中,一个指针指向了4个字节,如果sizeof(。。。),
。。。为double类型时,一个指针指向了8个字节。
。。。为结构体类型时(不知道可不可以,假设可以的话),那一个指针指向了N个字节。
那么一个指针最多可以指向多少个字节?

1、不是说系统64位它就是8字节,而是受限于地址总线的字节宽度,你的地址总线是64位的即指针就是8字节的,但是现在的64位个人pc多半是x86-64能兼容32位的应用程序。

2、有,你64 位的机器,它的虚拟内存可以到8TB,如果你在64位机上装个32位的windows你会发现,我的个去……慢的要死(我犯过这样的低级错误)

3、指针保存的是地址,比如32位机上,每个地址都是32位的,所以它始终都是4字节,没有最大或者最小。

观楼主英俊潇洒、风流倜傥,必当世之豪杰,诚邀楼主加入0x30百度贴吧,共商义举,成千秋霸业。追问

1、2的64次方为17179869184G,8TB是怎么算的

2、在64位机上装个32位的windows为什么会慢?我也确定也试过,慢的要死。

追答

8tb也不是那算的, 64位的地址线实际上连64根都不到,只实现了40~50根,因为足够用了,Windows x64版本限制了44位寻址,最大16TB内存,所以造成了所谓的AMD64空洞(用户空间在低位,内核空间在高位,而44位寻址不完全,中间必然有空洞) 

也就是说 真正的64位 么有实现

2、那样发挥不出它的性能,我的是外星人 三代i7 2.8 16g物理内存,装了32位系统后 物理内存只有4g,根本就发挥不出性能……。

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-06-27
1: 操作系统是64位的,不代表你的程序中的指针就是64位的,还要看你用的编译器,比如目前的vs,它的指针还是32位的,32位系统中使用16编译器也是一个道理
2:地址线和操作系统的位数没有关系,数据总线的宽度才和操作系统有关系,64位系统指的是一个时钟周期内cpu可操作的数据位的宽度,而这个宽度就是数据总线的宽度

3:举个例子 :
char (*p)[10000];
char a[3][10000];
p=a;
p++; //偏移了10000字节
第2个回答  2013-06-27

我感觉楼上的回答有点问题

    如果地址总线是64位,操作系统是32位,那一个指针依然是4字节(或者更少)。如果操作系统是64位的,那也不一定是8字节。原因是决定一个变量的字节长度的不是CPU也不是操作系统,而是你的编译器。例:如果在32位机上用TC来sizeof一个指针你会发现是2字节的,通过这个可以发现字节长度和CPU寻址没有直接联系,和这个密切相关的是你的编译器。而32位操作系统上你不可能装一个64位的编译器,所以长度最多还是4,即使是64位的操作系统,一般你用VC6.0的话,编译器还是32位的,也就是长度还是4,这个具体你可以试一下,我也只是说一下理论,具体我也没实践过。

    64位的CPU可以支持64位操作系统并兼容32位16位的,32位CPU可以支持32位操作系统兼容16位的,不过64位操作系统最多也只能支持16G内存,楼上说的8TB是指硬盘吗?

    当然可以为结构体,指针指向的内存的(首地址),而整个数据的长度大小取决于指针的变量类型,不管什么数据类型首地址都是一个字节。如int *p是一个首地址加1字节的长度,long* p是首地址加2个字节长度,etc

第3个回答  2013-06-27

    32系统指针32位,64系统指针就是64位

    有,一般操作系统位数据是指cpu一次处理数据长度。而这个长度一般与地址线根相同

    你没搞清楚指针的意思。指针里保存的只是地址值,至于它指向多少字节数据,那是程序员自己事的,除了内存不足,应该没上限样

第4个回答  2013-06-27
问题一:指针的大小是根据你定义大小而定义的,但是内存地址本身是根据操作系统定义的,比如你定义 char * addr,这个就只有一个8位,但是定义 int * addr2就是32位,但是他们所指向内存位置是64位的
问题二:你指的地址线是说操作系统寻址的地址线吧,如果是,那就有直接关系,内存寻址就是由寻址线给出数据的,32位那么操作系统就是32位,反之,内存寻址线是64,操作系统就必须是64位的
问题3:一个指针指向的是一片内存区域,没有指向大小限制

c语言指针的赋值问题
在C语言中,指针是一个变量,其特殊之处在于它存储的是其他变量的地址,而不是值本身。指针使我们能够间接地访问和修改变量的值。指针的赋值过程 当我们为指针变量赋值时,实际上是将其指向一个变量的内存地址赋给它。这个过程分为两步:首先确定变量的地址,然后将这个地址赋给指针变量。例如,如果我们...

关于c语言指针的一些问题。
1、不是说系统64位它就是8字节,而是受限于地址总线的字节宽度,你的地址总线是64位的即指针就是8字节的,但是现在的64位个人pc多半是x86-64能兼容32位的应用程序。2、有,你64 位的机器,它的虚拟内存可以到8TB,如果你在64位机上装个32位的windows你会发现,我的个去……慢的要死(我犯过...

c语言这几道题 关于指针的 望大神解答
1、D选项,*x本身就错误,因为x是int类型,没法使用*操作符。2、A之所以错是因为代码中有一句q=NULL,也就是说q是一个空指针了,你再向里面写东西就错了,而且你在vc6.0中可以试一下,马上会出现一条0xc000 0005的写异常。。3、是的,你不管给它赋值多少都是4的。。就好比一个4平方米的房子...

C语言指针问题
一、如有定义char y[4]= "321"则表达式 *y+2的值是'5' 。分析:y是字符串数组首元素'3'的地址,*y的值就是字符'3',再加上2,就是字符'5'(也可以说是字符'5'的ASC码值)。二、 如有定义char z[2][4]={"MAT", "LAB"};,则表达式*(*z+2)的值是 'T'。分析:z是二维字符...

初学C语言对C指针的疑惑
1、C的变量都有四个基本属性:名称、类型、地址、内容,类型决定变量在内存占据的空间的大小和内容的存储形式。指针是一种以内存地址作为内容的变量,若定义了一个指针变量,它和其他变量一样具有自己的名称,存储地址和记录的内容,指针数据类型的变量与其他数据类型的变量在存储上的区别就是不论是什么...

C语言中的指针问题到底是怎么回事~
指针的类型(即指针本身的类型)和指针所指向的类型是两个概念。当你对C越来越熟悉时,你会发现,把与指针搅和在一起的“类型”这个概念分成“指针的类型”和“指针所指向的类型”两个概念,是精通指针的关键点之一。我看了不少书,发现有些写得差的书中,就把指针的这两个概念搅在一起了,所以看起书来前后矛盾,...

C语言指针问题
变量之间互相赋值是正确的。“原因是被赋值的指针变量前不能再加*说明符”这句话的意思是:如果 给 指针P加上“*”,那么它就变成 了变量,代表的意义就变了,而地址只能赋值给指针不能给变量。最后建议学习看书一定要读国外原著,国内翻译或作者的理解或描述,未必就是正确和合适的。

c语言问题,关于指针的问题
一、比如我们定义一个int型指针变量。int *p=NULL;初值为空。那么当执行while(p);时,只有p==NULL时,while循环才会结束。所以如果我们写while(p);printf。。。;那么只有当p为空时,后面的printf才会执行。否则就一直循环,这样我们就能判断p为空了。同理!p,自然就能判断p不为空了。二、p...

c语言程序指针问题
1、指针赋值带来的内存丢失在C语言中指针之间是可以相互赋值的,但是使用不当可能会造成部分内存的“丢失” ,即这部分内存空间不能再被该任何程序访问。如: main(){float *a, *b;a=(float)malloc( sizeof( float));b=(float)malloc( ...

c语言指针问题
(2),对于*P1=*P2 操作之前,一定要先将P1和p2先指向变量。还有*p=3之前,也要先把p指向一个变量。指针就是一个指向地址的变量,使用之前需要先给它赋值,也就是先将将一个变量的地址赋值给它,这个时候指针里面存的就是这个变量的地址。理解了指针的概念,上面这些问题就好理解了~...

相似回答
大家正在搜