如何知道int*的长度?

dr2tr 2005-06-05 07:05:48
我想知道算法
请教
...全文
1516 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
William_Wang 2005-07-13
  • 打赏
  • 举报
回复
简单讲一下指针
指针是用来指向一个内存地址的,在16位环境下,内存地址范围是2^16,32位环境下是2^32 = 4G,这就是Win32环境下虚拟内存最大为4G的原因.一个指针的值最大就是4G-1(内存编号以0开始的).要用一个整形数来记录内存的值,那么很明显,这个整形数要32位,即4个字节.小了就指不到后面一部分内存地址,大了就浪费了.
William_Wang 2005-07-13
  • 打赏
  • 举报
回复
这个问题要分为动态数组和静态数组

环境:TC2
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>

void main()
{
int a[] = {1,2,3}; /*静态数组*/
int *b = (int*)malloc(sizeof(int)*6); /*动态数组*/
int *pa =a ; /*指针*/
int sizea = sizeof(a);
int sizepa = sizeof(pa);
int sizeb = sizeof(b);
clrscr();
printf("%d",sizea); /*结果是6*/
printf("%d",sizepa);/*结果是2*/
printf("%d",sizeb); /*结果是2*/
getch();
}
zhouhuahai 2005-07-13
  • 打赏
  • 举报
回复
如何知道int*的长度?
1.如果这个指针用new.
则new时的大小就是它的长度.
如: int *ptr = new int[12]; 它的长度就是12
2.如果用assign.
则右值的长度就是它的长度.
如: int *ptr, arr[10];
ptr = arr;//ptr的长度就是10了.

如果要用计算的办法, 那我的答案和楼上诸位的一样. 没办法(有一个例外: char *,可用strlen)
zhouhuahai 2005-07-13
  • 打赏
  • 举报
回复
char * psz[]={
"hello",
"this",
"three"
}
//////////////////////////////////////
int a = sizeof(psz); //a=12
为什么a==12?psz不是2维指针吗?

q=(char**)malloc(sizeof(char*)*5);
for(i=0;i<5;++i)
{
q[i]=(char*)malloc(sizeof(char)*5);
strcpy(q[i],"tt");
}
a=sizeof(q);
而这里的a==4,这是为什么?psz和q不都是一样的吗?

你先搞清psz和q是什么?
char * psz[]--->psz是个指针数组,它有三个元素,每个都是char *.
而32位机器上,每个指针所占用的空间为4.因此sizeof(psz)=3*4=12
q是一个指向char *的指针.而在32位机器上,任何指针所占用的空间都是4!
zhouhuahai 2005-07-13
  • 打赏
  • 举报
回复
?
4byte
今天看到一个比较疑惑的问题:
char * psz[]={
"hello",
"this",
"three"
}
这样的情况下面,
sizeof(*psz)是多大??
是不是数组最长的那个为准??

psz是一个指针数组,*psz <===>psz[1] 这是一个char *
因此sizeof(*psz) = 4 (32位机器)
dr2tr 2005-07-12
  • 打赏
  • 举报
回复
居然漏了这个问题,谢谢各位:

回复人: akirya(乱) ( ) 信誉:100 2005-06-05 19:18:00 得分: 0
我想是不是问int* 指向的数组的大小是多少?
如果是这个可以明确的告诉你,没有办法计算数来的
=====================================================================
我的意思就是这个,之前问过一些人,也跟我说是算不出来的
不过我想,这个可能跟编译器有关,在编译器里肯定有一个变量保存了数组的长度,只是我们的程序可能不容易得到吧。



回复人: gogdo() ( ) 信誉:100 2005-06-05 19:29:00 得分: 0
2. char **第二维的长度???
你是求指针的长度还是指针所指向内存的长度?
=================================================================
我是指指针的长度,比如a[m][n],那么第二维就是m了(不怎么精确的类比)



haoly(zhao) ( ) 信誉:100 2005-06-05 21:26:00 得分: 0
char * psz[]={
"hello",
"this",
"three"
}
//////////////////////////////////////
int a = sizeof(psz); //a=12
int b = sizeof(char *); //b=4
int c = sizeof(int *); //c=4
=======================================================
按照求a的方法,是不是说,我的第二个问题可以解决了。





surfer2888 2005-07-12
  • 打赏
  • 举报
回复
记住4巴
w1024www 2005-07-12
  • 打赏
  • 举报
回复
好象我在不知那本书上看到,说指针是unsignal long类型。
EagleMember 2005-07-12
  • 打赏
  • 举报
回复
是指针的长度吗?如果是。SIZEOF(INT*) WIN32 下为了32 位吧。
megaboy 2005-07-12
  • 打赏
  • 举报
回复
再认真看一下楼主的贴子,总算明白楼主的意思了,是不是:

char a[m][n];
char ** p;

让p得到a的地址,企图通过p来得到a的维数啊?那我跟你说,这样是得不到a的维数的,因为char ** p跟a[m][n]的类型是不同的,如果企图p=a,这样是不能通过编译的。二重指针p跟二维数组a完全是不同的类型,是不能这样做的。希望p=a通过的话,就一定要这样定义p:char (*p)[n],就是必须知道n,这样就可以p=a,同样的,对于a[m][n][k],也要这样定义p:char (*p)[n][k],才可以p=a。

但即使知道了n和k,也得不到m的,因为p不是一个数组名,只是一个指向二维数组的指针,对其进行sizeof(p),只会得到指针类型的大小,就是2个字节(16位机)或者4个字节(32位机)。
dr2tr 2005-07-12
  • 打赏
  • 举报
回复
恩。可能我的表述有问题
如我前面回的,对char** a来说,sizeof(a)是4,所以应该还是不对的
megaboy 2005-07-12
  • 打赏
  • 举报
回复
to 楼主:

对于char a[m][n],即使不知道m和n是多少,一样可以求出m是多少,表达式如下:

sizeof(a)/sizeof(a[0])/sizeof(char);

其中n=sizeof(a[0])
WoodJohn 2005-07-12
  • 打赏
  • 举报
回复
4
dr2tr 2005-07-12
  • 打赏
  • 举报
回复
回复人: calabash_b(葫芦娃) ( ) 信誉:100 2005-07-12 18:20:00 得分: 0
char * psz[]={
"hello",
"this",
"three"
}
//////////////////////////////////////
int a = sizeof(psz); //a=12
为什么a==12?psz不是2维指针吗?

q=(char**)malloc(sizeof(char*)*5);
for(i=0;i<5;++i)
{
q[i]=(char*)malloc(sizeof(char)*5);
strcpy(q[i],"tt");
}
a=sizeof(q);
而这里的a==4,这是为什么?psz和q不都是一样的吗?
===========================================================
我认为这两个是不一样的,sizeof(M),当M为数组是,sizeof返回数组的总字节数(当然,sizeof(pointer数组)的结果自然是:pointer长度*数组长=4*3=12;
而后者也许就不同了,因为p只是一个指针,sizeof(pointer)返回的自然只是一个指针的长度。所以是4。
当然,如mxtah(mxtah) 说的,这个4要根据不同机器的字长来决定是否变化了。




回复人: megaboy(此人已注销) ( ) 信誉:100 2005-07-12 18:40:00 得分: 0
to 楼主:

对于char a[m][n],m这个值是可以直接求出来的,表达式如下:

sizeof(a)/n/sizeof(char);

得出的值就是m这个数。
=================================================
谢谢你的回复。
只是可能我说的不太清楚,我的意思是m,n是未知的,我只知道一个char**的指针。有兴趣的话可以看看我前面会的帖子。


顺便我找了一篇有关sizeof的介绍,有兴趣的兄弟可以看看。
http://www0.ccidnet.com/tech/guide/2001/01/08/58_1552.html
megaboy 2005-07-12
  • 打赏
  • 举报
回复
to 楼主:

对于char a[m][n],m这个值是可以直接求出来的,表达式如下:

sizeof(a)/n/sizeof(char);

得出的值就是m这个数。
calabash_b 2005-07-12
  • 打赏
  • 举报
回复
char * psz[]={
"hello",
"this",
"three"
}
//////////////////////////////////////
int a = sizeof(psz); //a=12
为什么a==12?psz不是2维指针吗?

q=(char**)malloc(sizeof(char*)*5);
for(i=0;i<5;++i)
{
q[i]=(char*)malloc(sizeof(char)*5);
strcpy(q[i],"tt");
}
a=sizeof(q);
而这里的a==4,这是为什么?psz和q不都是一样的吗?
mxtah 2005-07-12
  • 打赏
  • 举报
回复
似乎没有不是4的指针
===================
on deference platform,it can be not 4...
fireman_lh 2005-07-12
  • 打赏
  • 举报
回复
似乎没有不是4的指针
mxtah 2005-07-12
  • 打赏
  • 举报
回复
4byte
今天看到一个比较疑惑的问题:
char * psz[]={
"hello",
"this",
"three"
}
这样的情况下面,
sizeof(*psz)是多大??
是不是数组最长的那个为准??
===========================
because *psz is same as psz[0],psz[0] is a pointer to string "hello",so
sizeof(*psz) is 4....
力为 2005-07-12
  • 打赏
  • 举报
回复
stl的vector可以当作数组来用。
何必搞得这么麻烦呢。
加载更多回复(15)

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧