首页 > 试题广场 >

下列关于数组与指针的区别描述正确的是?

[单选题]
下列关于数组与指针的区别描述正确的是?
  • 数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。
  • 用运算符sizeof 可以计算出数组的容量(字节数)
  • 指针可以随时指向任意类型的内存块。
  • 用运算符sizeof 可以计算出指针所指向内容的容量(字节数)
A.堆上创建动态数组
B.sizeof(数组名)就是数组的容量
C.const指针不可以
D. char* str = "hello"; sizeof(str)不能计算出内容的容量,只是指针的容量。
发表于 2016-04-19 21:08:22 回复(9)
A. 堆上创建数组
C. char * const p; 指针常量
D. sizeof(指针) = 4
编辑于 2016-02-25 09:23:07 回复(6)

数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。指针可以随时指向任意类型的内存块。

(1)修改内容上的差别

char a[] = “hello”;

a[0] = ‘X’;

char *p = “world”; // 注意p 指向常量字符串

p[0] = ‘X’; // 编译器不能发现该错误,运行时错误

(2) 用运算符sizeof 可以计算出数组的容量(字节数)。sizeof(p),p 为指针得到的是一个指针变量的字节数,而不是p 所指的内存容量。C++/C 语言没有办法知道指针所指的内存容量,除非在申请内存时记住它。注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。

char a[] = "hello world";

char *p = a;

cout<< sizeof(a) << endl; // 12 字节

cout<< sizeof(p) << endl; // 4 字节

计算数组和指针的内存容量

void Func(char a[100])

{

cout<< sizeof(a) << endl; // 4 字节而不是100 字节

}

发表于 2014-10-25 00:26:12 回复(6)
void f() { int* p=new int[5]; } 
这条短短的一句话就包含了堆与栈,看到new,我们首先就应该想到,我们分配了一块堆内存,那么指针p呢?他分配的是一块栈内存,所以这句话的意思就是:在栈内存中存放了一个指向一块堆内存的指针p。在程序会先确定在堆中分配内存的大小,然后调用operator new分配内存,然后返回这块内存的首地址,放入栈中,他在VC6下的汇编代码如下:
00401028 push 14h
0040102A call operator new (00401060)
0040102F add esp,4
00401032 mov dword ptr [ebp-8],eax
00401035 mov eax,dword ptr [ebp-8]
00401038 mov dword ptr [ebp-4],eax
也就是数组如果不是全局数组的话,一定是栈上,不过可能有个指针指向堆的内存(此时为动态数组)
编辑于 2015-12-03 12:26:14 回复(4)
A:int a[10];      //全局数组,静态存储区创建 int fun() { int b[10];      //局部数组,栈内创建 } int main() { int *p=(int *)malloc(sizeof(int)*10);   //这是动态数组,堆上创建 } 
C:指针可以随时指向任意类型的内存块,它的特征是“可变”
char * const p; 指针常量 则指向的地址不可变
发表于 2017-01-25 08:53:30 回复(0)
如果面试遇到这种题很坑啊!其实硬要解释C也是对的。因为它只是说“可以”并没有说“必须”。就像你有工作,但是“你可以去不上班”,难道说你有工作就是错的吗?所以像讨论区里说什么“const”的完全就看你怎么理解C这句话了。
编辑于 2017-11-24 10:28:48 回复(0)
A.堆上创建动态数组 B.sizeof(数组名)就是数组的容量 C.const指针不可以 D. char* str = "hello"; sizeof(str)不能计算出内容的容量,只是指针的容量。 注意C和D这两种情况的特殊性
发表于 2019-08-27 23:51:58 回复(0)
A,静态区,堆,栈都可以创建数组;
B,对;
C,随时的意思是,指针变量的值可以改变?无聊
D,假如只知道指针变量,那么我们只可以sizeof(指针变量),sizeof无法计算指针指向变量的大小。
编辑于 2018-06-22 11:58:10 回复(0)
A应该是错误的吧。数组也可以在堆上创建
发表于 2015-12-03 11:03:45 回复(0)
堆上创建动态数组
发表于 2020-04-17 20:37:40 回复(0)
说好的多选呢
C选项:指针常量在指向一个内存块后不能再指向其他内存块
例:int  a=1;  
       int  b=2;
       int * const p=&a; //正确
       int * const p=&b; //错误

发表于 2019-06-10 19:54:24 回复(0)
数组要么在静态存储区被创建(如全局数组),要么在栈或堆上被创建。静态数组建立的方式为:A a[],它在栈上分配空间;动态方式是使用new,malloc在堆上分配。
编辑于 2018-05-17 17:11:55 回复(0)
数组是在堆上创建的 sizeof(数组名)=数组的存储大小 sizeof(指针)=指针的大小,64位系统,指针大小为8字节,32位系统,指针大小为4字节。
发表于 2018-03-28 16:28:14 回复(0)
A.动态数组
C.const指针
D.数组名退化成指针无法计算长度(???)
发表于 2017-09-30 21:56:27 回复(0)
int array[] = new int [N];
这个不就是在堆上面建立了一个数组吗,所以A是错的。
发表于 2015-08-30 12:37:38 回复(0)
问一下,我看有人说sizeof计算的是栈内存,那么能否计算用new分配的动态数组。
发表于 2020-03-17 16:26:34 回复(0)
对于A选项,数组要么在静态存储区被创建(如全局数组),要么在堆上被创建
对于B选项,sizeof(arr),可计算出数组的容量;
对于C选项,若为指针常量,则不可,const指针;
对于D选项,sizeof(指针),应为计算指针的大小,32位平台下为4个字节

发表于 2017-07-21 12:18:09 回复(1)
啥头像
ABC。
A中不包含堆,因为从堆上new出来的都是指针,跟这个数组还是有点区别
C中指针可以指向任意内存块,不同类型指针只是解读方式不同
发表于 2015-12-17 21:12:41 回复(0)
A答案肯定是错的,这个毫无疑问
关于C答案,我觉得题目的意思是指针可以指向任意内存,但是能不能合法操作就是另一回事了
发表于 2015-09-08 19:19:08 回复(0)
extern 的外部数组,sizeof 没法算出大小
发表于 2024-10-16 14:17:38 回复(0)