关于C++中char 型变量的地址输出

在刚开始学习C/C++过程中,我们希望输出各个变量的地址来窥探一些我们“百思不得其解”的现象,例如搞清函数堆栈相关的程序内部秘密。

先看下面示例:

#include<stdio.h>
#include<iostream>
using namespace std;  

class TestArrange
{
public:
    long m_lng;
    char m_ch1;  

    TestArrange()
    {
        m_lng = 0;
        m_ch1 = ‘a‘;
        m_int = 0;
        m_ch2 = ‘a‘;
    }  

    const int* GetIntAddr()
    {
        return &m_int;
    }
    const char* GetChar2Addr()
    {
        return &m_ch2;
    }  

private:
    int m_int;
    char m_ch2;
};  

int main(void)
{
    TestArrange test;
    cout << "对象的地址:" << &test << endl;
    cout << "m_lng地址:" << &(test.m_lng) << endl;
    cout << "m_ch1地址:" << &(test.m_ch1) << endl;
    cout << "m_int地址:" << test.GetIntAddr() << endl;
    cout << "m_ch2地址:" << (void *)test.GetChar2Addr() << endl;
    return 0;
}  

重点来看m_char1的输出地址:

将源码中

cout << "m_ch1地址:" << &(test.m_ch1) << endl;

改为:

printf("m_ch1地址:%p\n",&(test.m_ch1));  

m_char1的输出地址:

为什么会出现这样现象,因为字符串是以空终止符(‘\0‘)结尾的字符数组,通过字符串中第一个字符的指针访问字符串。字符串的值是字符串中第一个字符的(常量)地址。&m_char1是一个char*变量,但&m_char1保存的字符串是没有终止符(‘\0‘),因此输出乱码。

无论要输出哪一种变量地址,强制类型转换可以解决大多数问题,如上将char*转换为void*输出。

时间: 2024-11-05 21:26:16

关于C++中char 型变量的地址输出的相关文章

c++输出char型变量与字符串的地址

在c里面如果指针是一个基本数值型 int ,foalt ,long等,如果输出里有 cout << ptr << endl; 其中ptr是指针的名,则输出的值是指针的地址, 如果是char * (char指针) 则输出的是char指针的值. 在C++中,熟悉int和char型的变量是最基本不过的了,不过,我想,很多初学者会跟我一样,搞不懂如何输出一个char变量的地址?就举下面一个例子: int i=97; char c='a'; cout<<"line 1:

java 常见的几种类型范围说明,char 型变量中能不能存贮一个中文汉字

package com.yuan.test; public class Autogrew { public static void main(String[] args) {  // 保存 short 可取的最大值的常量,最大值为 215-1.(32 767)   // 保存 short 可取的最小值的常量,最小值为 -215.(-32 768)      short s1=11278;      s1+=1;      //s1=s1+1;//报错 自动会转换成int 类型      Syst

char型变量中能存贮一个中文汉字

char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中当然可以存储汉字啦.不过,如果某个特殊的汉字没有被包含在unicode编码字符集中,那么,这个char型变量中就不能存储这个特殊汉字.补充说明:unicode编码占用两个字节,所以,char类型的变量也是占用两个字节. 备注:后面一部分回答虽然不是在正面回答题目,但是,为了展现自己的学识和表现自己对问题理解的透彻深入,可以回答一些相关的知识,做到知无不言,言无不尽.

java中volatile型变量 说明

volatile变量具有两种特性: 保证此变量对所有线程的可见性,注意:java里的运算不是原子操作,导致volatile变量在并发下存在不一致的问题. 使用规则要求 a. 运算结果并不依赖变量的当前值,或者能够确保只有单一的线程修改变量的值. b. 变量不需要与其他的状态变量共同参与不变约束. 禁止指令重排序优化 其他说明: Java内存模型中定义以下八种操作(具有原子性)完成: 1.lock(锁定):作用于主内存的变量,它把一个变量标识为一条线程独占的状态. 2.unlock(解锁):作用于

char型变量中能不能存储一个中文汉字,为什么?

在C语言中,char类型占1一个字节,而汉子占2个字节,所以不能存储. 在Java中,char类型占2个字节,而且Java默认采用Unicode编码,一个Unicode码是16位,所以一个Unicode码占两个字节,Java中无论汉子还是英文字母都是用Unicode编码来表示的.所以,在Java中,char类型变量可以存储一个中文汉字. 原文地址:https://www.cnblogs.com/arvins/p/8504429.html

char型变量中能不能存贮一个中文汉字

在C语言中,char类型占1一个字节,而汉子占2个字节,所以不能存储. 在Java中,char类型占2个字节,而且Java默认采用Unicode编码,以个Unicode码是16位,所以一个Unicode码占两个字节,Java中无论汉子还是英文字母都是用Unicode编码来表示的.所以,在Java中,char类型变量可以存储一个中文汉字.

为什么声明了int型的变量并且直接初始化后,int型变量的地址一直在变化?

1 /************************************************************************* 2 > File Name: ptr_variable.c 3 > Author: Mr.Yang 4 > Purpose:演示指向变量的指针 5 > Created Time: 2017年06月03日 星期六 08时47分33秒 6 ************************************************

SQL SERVER中LIKE使用变量类型不同输出结果不一致解惑

一同事在写脚本时,遇到一个关于LIKE里面使用不同的变量类型导致查询结果不一致的问题,因为这个问题被不同的人问过好几次,索性总结一下,免得每次都要解释一遍,直接丢一篇博客岂不是更方便!其实看似有点让人不解的现象背后实质跟数据类型的实现有关. 下面我们构造这样一个类似的简单案例.如下所, CREATE TABLE TEST (ID        INT IDENTITY(1,1), NAME    VARCHAR(32) )   INSERT INTO dbo.test SELECT 'abc32

3.5 wchar_t双字节型变量

char 型变量可以存储一个字节的字符,只能用来保存英文字符和标点符号. 存储汉字.韩文与日文不可以,因为这个文字占据有两个字节. C++引入 wchar_t 类型(双字节类型,又名宽字符类型)来解决 定义宽字符 wchar_t wt[]=L"中"; 定义了一个wchar_t类型的数组变量wt,用来保存中文字符“中”,大写字母L告诉编译器,为“中”分配两个字节的空间. 例子 #include<iostream> #include<locale> using na