首页 > 试题广场 >

下面程序的输出结果是( ) #in...

[单选题]
下面程序的输出结果是()
#include <iostream>
using namespace std;

int main() 
{
    char str1[] = "hello world";  
    char str2[] = "hello world";  

    const char str3[] = "hello world";  
    const char str4[] = "hello world";  

    const char* pstring1 = "hello world";  
    const char* pstring2 = "hello world";  

    cout << boolalpha << ( str1==str2 ) <<  ',' ; 
    cout << boolalpha << ( str3==str4 ) << ',' ;  
    cout << boolalpha << ( pstring1==pstring2 ) <<endl;

    return 0;
}


  • false,false,true
  • false,false,false
  • true,true,true
  • false,true,true
这个题主要是考察,变量在内存的存放的地点。感觉还可以加强一下变得难一些,比如比较地址的大小等等。
str1、str2、str3以及str4都是栈中定义的局部变量数组,并且进行了初始化,地址肯定会不一样。
pstring1、pstring2则是指针,虽然本身在栈中,但是所指向的是一个字串常量。题中比较的就是所指向的地址,所以为true。

#include<iostream>
using namespace std;
int main(void)
{
    char str1[] = "hello world";   //存放在栈中的数组
    char str2[] = "hello world";   //存放在栈中的数组

    const char str3[] = "hello world";  //存放在栈中的字符串常量
    const char str4[] = "hello world";  //存放在栈中的字符串常量

    const char* pstring1 = "hello world";   //本身在栈中,指向常量的指针
    const char* pstring2 = "hello world";   //本身在栈中,指向常量的指针     //显然二者所指向的地址一致

    int x = (int)pstring1;
    int y = (int)pstring2;                  //为了方便打印出指针所指向的地址

    cout << boolalpha << ( str1==str2 ) << endl;               //比较字串首地址      flase
    cout << boolalpha << ( str3==str4 ) << endl;               //比较字串首地址      flase
    cout << boolalpha << ( pstring1==pstring2 ) <<endl;        //比较指针所指地址    true

    cout << "str1=" << &str1 << ",";
    cout << "str2=" << &str2 << endl;

    cout << "str3=" << &str3 << ",";
    cout << "str4=" << &str4 << endl;

    cout << "pstring1=" << &pstring1 << ",";
    cout << "pstring2=" << &pstring2 << endl;                   //输出指针本身地址

    cout<<hex;
    cout << "pstring1=" << x << ",";
    cout<<hex;
    cout << "pstring2=" << y << endl;      //16进制输出指针所指地址

    return 0;
}



编辑于 2019-11-12 19:00:52 回复(2)
char *str和char str[]的区别:
char *str = "hello"; //str指向字符串常量"hello"的首地址,str存放在栈上,"hello"保存在文字常量区。通过指针只能访问字符串常量,不可以改变它

char str[] = "hello"; //数组名str也是指向字符串的首地址,str,"hello"都存放在栈上。可以通过指针去访问和修改数组内容

查看 const char* pstring1 = "hello world"; 和const char* pstring2 = "hello world";  的地址时,它们的地址是相同的。

发表于 2019-10-30 11:51:42 回复(0)
一、预备知识—程序的内存分配

一个由c/C++编译的程序占用的内存分为以下几个部分
 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分    配方式倒是类似于链表,呵呵。
 3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始    化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放
 4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放
 5、程序代码区—存放函数体的二进制代码。

二、例子程序

这是一个前辈写的,非常详细
//main.cpp
int a = 0; 全局初始化区
char *p1;  全局未初始化区
main()
{
  int b; 栈
  char s[] = "abc"; 栈
  char *p2; 栈
  char *p3 = "123456"; 123456/0在常量区,p3在栈上。
  static int c =0; 全局(静态)初始化区
  p1 = (char *)malloc(10);
  p2 = (char *)malloc(20); 
  分配得来的10和20字节的区域就在堆区。
  strcpy(p1, "123456"); 123456/0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
}  https://blog.csdn.net/daweibalang717/article/details/46724723

发表于 2020-03-05 17:27:37 回复(1)
数组存放是两个不同的地址的常量,指针指向地址相同的常量
发表于 2021-12-05 21:55:17 回复(0)
<p>字符串常量 存储地址相同</p>
发表于 2020-08-21 11:49:33 回复(0)
const修饰的全局变量在常量区, . bss段,未初始化的全局变量,静态内存分配。. data段,已初始化的全局变量,也是静态内存分配。. heap段,new和malloc申请的内存位置,大小不固定。. rodata段,只读常量段,字符串和const修饰的全局变量(const修饰的局部变量还是放在栈中,只是函数结束之前只读) 。. stack段,函数中临时创建的局部变量,被调用函数的参数也被压入调用他的函数的帧栈中,有最大栈空间限制。
发表于 2020-08-05 08:04:03 回复(0)
//main.cpp int a = 0; 全局初始化区 char *p1; 全局未初始化区 main() { int b; 栈 char s[] = "abc"; 栈 char *p2; 栈 char *p3 = "123456"; 123456/0在常量区,p3在栈上。 static int c =0; 全局(静态)初始化区 p1 = (char *)malloc(10); p2 = (char *)malloc(20); 分配得来的10和20字节的区域就在堆区。 strcpy(p1, "123456"); 123456/0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。 }
发表于 2021-10-19 16:10:11 回复(0)
在本题中,str1,str2,str3,str4相互比较的是地址,而pstring1,pstring2相互比较的是内容
发表于 2022-08-22 19:26:16 回复(1)

输出j


发表于 2019-09-11 15:50:44 回复(0)
这是精髓提。
发表于 2019-09-02 19:34:11 回复(0)
str1,str2,str3,str4均是数组,数组有自己独立的空间,虽然数组内的内容相同,但是数组的地址不相同,所以返回值为false;而pstring1和pstring2则是指向字符串字面量的指针,指针指向的内容是相同的,地址也有可能是相同的。
发表于 2024-03-04 21:19:54 回复(0)
比较的不是内容,是首地址
发表于 2023-07-08 09:45:17 回复(0)
常量字符串在代码段的地址唯一,两指针指向一个地址。 栈是从上往下存放变量的,新定义的变量地址比先定义的要小
发表于 2020-05-19 19:58:34 回复(0)
【1】char *str和char str[]的区别: char *str = &quot;hello&quot;; //str指向字符串常量&quot;hello&quot;的首地址,str存放在栈上,&quot;hello&quot;保存在文字常量区。通过指针只能访问字符串常量,不可以改变它 char str[] = &quot;hello&quot;; //数组名str也是指向字符串的首地址,str,&quot;hello&quot;都存放在栈上。可以通过指针去访问和修改数组内容 查看 const char* pstring1 = &quot;hello world&quot;; 和const char* pstring2 = &quot;hello world&quot;; 的地址时,它们的地址是相同的。 【2】这个题主要是考察,变量在内存的存放的地点。感觉还可以加强一下变得难一些,比如比较地址的大小等等。 str1、str2、str3以及str4都是栈中定义的局部变量数组,并且进行了初始化,地址肯定会不一样。 而pstring1、pstring2则是指针,虽然本身在栈中,但是所指向的是一个字串常量。题中比较的就是所指向的地址,所以为true。
编辑于 2020-02-25 14:38:21 回复(0)
str1与str2比较的是首地址
编辑于 2024-03-11 15:47:15 回复(0)
在本题目中,数组在内存中具有不同的起始地址;指针指向相同的字符串字面量!
发表于 2022-03-21 09:19:20 回复(0)