`
finally_mm
  • 浏览: 25101 次
  • 性别: Icon_minigender_2
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

字符指针的特殊之处

    博客分类:
  • C++
阅读更多


  如果我们对一个非字符的指针进行操作,方法是这样的:

  定义:
    (1)int a=7; int *p=&a; 或者
    (2)int a=7; int *p; p=&a; 或者
    (3)int a=7; int *p; *p=a;

  (1)这样定义的原因是因为等号两边的类型必须匹配,int *p=&a; 等号左边定义的是一个指针,指针的内容是地址,所以等号右边也应该是地址,&a就是取空间a的地址;
    (2)int *p; p=&a; 为什么不是 *p=&a 而是 p=&a; 因为在定义的时候“*”只是说明p是一个指针,而p也是一个变量,不过是储存地址的一种特殊的变量,对于变量使用,我们都是直接使用它的名字,就好象,我们定义个常量 const a=7; 我们要调用它的时候直接使用a就可以了,并不需要带上 const 修饰,这里也一样,用指针变量时并不需要带上“*”;
    (3)而第三种情况中的 *p=a;中的“*”和第二种里面是不同的,这里的“*”是取内容符,与之相反的是取地址符“&”,分析一下,第三种情况中,等号左边是*p表示对指针p取内容,它的内容指向内存中的某个已经在开始通过 int *p; 定义好的空间里(比较确切一点的说法是,p在定义的时候,其内容里的地址指向内存中某个未知的空白区域,即未占用,不受保护的内存空间),这个空间里存放的数据类型是整型,所以等号的右边也应该是整型才能匹配,所以是 *p=a; 这里的“*”和定义时候的是不同的,这一点很重要。

  其实上面的都是些题外话,我要说的其实是关于指针的输出的一些问题。我们利用上面定义好的进行输出操作。

  输出指针的内容(即所指向空间的地址):cout<<p<<endl;
  输出指针所指的内容(即指针内容所描述地址空间中的内容):cout<<*p<<endl;

  指针对于字符的处理却有些特殊,和前面的非字符的指针输出处理要分开理解。

  比如,我们定义一个 char a='A'; char *p=&a;  如果我们调用上面非字符指针的输出方式,结果如下:
  方式1 cout<<p<<endl; 结果 A####(#表示乱码,不可识别) 并不是地址
  方式2 cout<<*p<<endl; 结果 A 这和非字符的指针情况一样,输出指针指向的内容
  而且我们直接操作 cout<<&a<<endl; 结果和方式1的结果是完全相同的

  为什么方式1输出的不是地址呢?这里有一个特殊的处理,虽然这里的p的内容确确实实是一个地址,但是cout操作字符指针的话,它遇到地址,就会直接去寻找这个地址所指向的内容,并把它的空间里的机器数按照字符的规则转化成字符输出,直到遇到“\0”这个操作符才停止。所以我们直接输出p的时候,它先输出‘A’然后再继续读取后面的内存空间知道遇到“\0”,显示结果是“A+乱码”。

  你肯定会说,为什么要这样呢,这样多不方便呀,其实这么做是有目的的,而且恰恰就是为了方便才这么设置的。因为这样就可以很容易的处理字符串了,而处理字符串是我们在计算机中用得很多的操作。

  比如我们第一个字符串数组 char a[]="mantou"; a[]在内存中在7个字节,而不是6个,因为在mantou字符串后面还隐藏有一个“\0”,这时我们用 char *p=a; (这里不用&a是因为,a[]是一个数组,数组名a本身就是一个指针常量) 输出操作 cout<<p<<endl; 这里就不会输出地址,而是直接输出整个mantou字符串,很方便哈,如果我们 cout<<*p<<endl; 结果显示的是m,因为p是指向数组的首元素的地址的,就是指向这里的储存m的空间的地址,所以取p的内容(*p),只能输出一个m哦。

  虽然通常情况下我们是不需要了解我们的数据地址的,但我也顺便说说,怎么得到字符指针的地址,也可以方便大家对内存地址的分配再做更深入的研究。

  char a='A';  如果这里直接输出 cout<<&a<<endl; 当然是不能输出地址的,原理上面已经说过了,cout遇到字符型地址就会转换成字符串输出。我们可以用指针p先取得a的地址(char *p=&a;),但是这样用 cout<<p<<endl;也并不能得到地址呀,原因上面也说过了。
    做个小技巧,首先我们知道p中的内容本身就是地址,但是因为它是字符串,我们又不能直接输出它,所以呀,我们可以把指针里的内容(记载的是一个地址数据)强制转化成整型再输出 cout<<(int)p<<endl; 呵呵,这样就得到了这个指针里的内容——十进制型的地址,而我们知道,地址是用十六进制表示的,形式是 0x######## 0x后面加8位十六进制数,我们把我们先得到的十进制地址按照地址的表示形式用流操作转化成十六进制就可以了。代码如下:
cout<<endl<<"0x"
     <<setw(8)<<setiosflags(ios::right)<<setfill('0')
     <<setiosflags(ios::uppercase)<<hex<<(int)p<<endl;

注意不要忘了 #include<iomanip.h> 这个头文件哦 
分享到:
评论

相关推荐

    字符数组与字符指针

    ### 字符数组与字符指针详解 #### 一、引言 在C/C++编程语言中,字符数组和字符指针是非常重要的数据类型,尤其是在处理文本数据时。这两种类型的使用非常广泛,但在实际编程过程中,不少开发者往往会在它们之间...

    C语言字符串指针(指向字符串的指针)_C语言中文网1

    在C语言中,字符串其实是由字符组成的数组,但由于其特殊性,经常被单独讨论。由于C语言并没有专门的字符串类型,我们通常使用字符数组来表示字符串。然而,指针是C语言中非常重要的一个概念,它能指向内存中的任何...

    字符串与指针

    指针是一种特殊的变量类型,它存储的是内存地址。通过指针可以访问该地址所指向的数据。 #### 二、示例代码解析 ```cpp #include #include void main(void) { char *p1 = "I am a student"; // 创建指向字符串的...

    C语言程序设计-指针与字符串.pptx

    字符指针(char *)是一种特殊的指针类型,它专门用来存储字符类型的内存地址。例如,`char *pc` 定义了一个指向字符的指针变量pc。要给这个指针赋值,我们可以使用取址运算符`&`,如 `char c; pc = &c;` 这将使pc...

    字符型指针与字符串.zip

    字符型指针(char *)是一种特殊的指针类型,它存储的是一个字符变量的地址。例如,我们可以声明一个字符型指针并将其初始化为某个字符数组的首地址: ```c char str[] = "Hello, World!"; char *ptr = str; ``` ...

    指针_字符串-指针_字符串

    指针是一个变量,它存储的是另一个变量的内存地址,而字符串则是由字符序列组成的特殊数据类型。接下来,我们将深入探讨这两个主题。 首先,我们来看数组。数组是一种数据结构,它允许我们在内存中存储相同类型的...

    C语言教学课件:14-3_指针数组(用于处理二维数组或多个字符串).ppt

    例如,下面是一个字符指针数组的定义: ```c char *pa[10]; /* pa 是数组,其元素是字符指针。 */ ``` 这种数组的每个元素都是一个指针,指向一个字符或字符串。 二、指针数组的使用 指针数组可以用于处理二维数组...

    栈字符数组&混淆指针和数组所导致的错误

    在编程世界中,栈字符数组和指针与数组的关系是两个重要的基础知识,它们在实际编程中经常被使用,但同时也容易引发错误。本文将详细探讨这两个主题,旨在帮助你理解和避免相关的问题。 首先,让我们来看看栈字符...

    指针进阶之数组参数和指针参数

    字符指针是一个特殊的指针,它指向的是一个字符数组。我们可以通过字符指针来访问和操作字符串。在C语言中,我们可以使用const关键字来修饰字符指针,表示该指针指向的字符串内容不能被修改。 2. 指针数组和数组...

    C语言第讲指针与字符串字符数组PPT学习教案.pptx

    1. **存储格式**:字符指针变量中存储的是字符串的首地址,这个地址通常占用2字节。而字符数组则直接存储整个字符串,每个数组元素存放一个字符。 2. **性质**:字符数组名是一个地址常量,一旦初始化后就不能改变...

    C语言指针总结C语言指针总结

    * 字符数组由若干元素组成,每个元素存放一个字符,而字符指针变量只存放字符串的首地址,不是整个字符串。 * 对数组初始化要用 static,对指针变量不用。 * 对字符数组赋值,只能对各个元素赋值,不能象下面这样:...

    C语言指针练习填空和阅读程序题

    在C语言中,字符串是一种特殊的数组,字符串的每个元素是一个字符。例如,`char str[]="hello";`,其中`str`是指向字符串的指针。通过指针可以访问字符串的各个元素,例如,`str[0]`表示字符串的第一个字符,而`*...

    C语言中指针和字符串的辩证.pdf

    这一系列示例和分析清楚地说明了指针在操作字符串时的特殊情况。要正确地操作字符串,应该注意以下几点: - 字符串常量(字面量)通常存储在只读的内存段中,尝试修改它们的内容会导致未定义行为。 - 字符串变量...

    C++数组指针与字符串.pdf

    C++数组指针与字符串 本资源摘要信息将详细介绍C++数组指针与字符串的相关知识点,通过实验报告和代码实现来讲解C++程序设计语言中的数组、指针和字符串处理。 一、数组 在C++中,数组是一种数据结构,用于存储多...

    c语言面试题之双指针反转字符串中的单词III.zip

    总之,掌握双指针技巧是C语言程序员必备的技能之一,它在解决字符串操作、数组排序等问题时展现出强大的灵活性和效率。通过理解和熟练运用双指针,开发者可以在面试中展示出扎实的算法基础和解决问题的能力。

    C语言程序设计数组字符串指针PPT学习教案.pptx

    "C语言程序设计数组字符串指针PPT学习教案.pptx" 该PPT学习教案主要讲解了C语言程序设计中数组、字符串和指针的概念和使用方法。 数组是C语言中一种重要的数据结构,用于存储一组相同类型的数据元素。数组可以是一...

    指针指针数组多级指针动态指针PPT学习教案.pptx

    这里,pStr 是一个字符指针数组,包含 5 个元素,每个元素都是一个字符指针。 指针数组的应用非常广泛,例如: * 字符串操作:指针数组可以用来存储和操作字符串。 * 数据结构:指针数组可以用来实现链表、树形...

    keil C51 指针总结

    Keil C51 指针是 Keil uv2 用户指南中的一部分,指针在 C 语言中是一种重要的数据类型, Keil C51 的指针可以分为两种,一种是普通指针,另一种是内存特殊指针。 一、普通指针 普通指针的定义方式与标准 C 语言...

    学习C语言之彻底搞定指针

    5. **字符串处理**:字符串在C语言中实际上是以字符数组的形式存在,因此字符串的处理经常涉及到字符指针。 【指针的类型和级别】 指针也有自己的类型,比如指针可以指向整型、浮点型、字符型等基本类型,也可以...

Global site tag (gtag.js) - Google Analytics