`
bjmike
  • 浏览: 277533 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

C/C++中字符指针数组及指向指针的指针的含义

阅读更多
就指向指针的指针,很早以前在说指针的时候说过,但后来发现很多人还是比较难以理解,这一次我们再次仔细说一说指向指针的指针。

  先看下面的代码,注意看代码中的注解:

#include <iostream> 
#include <string> 
using namespace std; 
 
void print_char(char* array[],int len);//函数原形声明 
 
void main(void)   

//-----------------------------段1----------------------------------------- 
    char *a[]={"abc","cde","fgh"};//字符指针数组 
    char* *b=a;//定义一个指向指针的指针,并赋予指针数组首地址所指向的第一个字符串的地址也就是abc\0字符串的首地址 
    cout<<*b<<"|"<<*(b+1)<<"|"<<*(b+2)<<endl; 
//------------------------------------------------------------------------- 
 
//-----------------------------段2----------------------------------------- 
    char* test[]={"abc","cde","fgh"};//注意这里是引号,表示是字符串,以后的地址每加1就是加4位(在32位系统上) 
    int num=sizeof(test)/sizeof(char*);//计算字符串个数 
    print_char(test,num); 
    cin.get(); 
//------------------------------------------------------------------------- 

 
void print_char(char* array[],int len)//当调用的时候传递进来的不是数组,而是字符指针他每加1也就是加上sizeof(char*)的长度 

    for(int i=0;i<len;i++) 
    { 
        cout<<*array++<<endl; 
    } 
}

  下面我们来仔细说明一下字符指针数组和指向指针的指针,段1中的程序是下面的样子:

char *a[]={"abc","cde","fgh"}; 
char* *b=a; 
cout<<*b<<"|"<<*(b+1)<<"|"<<*(b+2)<<endl;

  char *a[]定义了一个指针数组,注意不是char[], char[]是不能同时初始化为三个字符的,定义以后的a[]其实内部有三个内存位置,分别存储了abc\0,cde\0,fgh\0,三个字符串的起始地址,而这三个位置的内存地址却不是这三个字符串的起始地址,在这个例子中a[]是存储在栈空间内的,而三个字符串却是存储在静态内存空间内的const区域中的,接下去我们看到了char* *b=a;这里是定义了一个指向指针的指针,如果你写成char *b=a;那么是错误的,因为编译器会返回一个无法将char* *[3]转换给char *的错误,b=a的赋值,实际上是把a的首地址赋给了b,由于b是一个指向指针的指针,程序的输出cout<<*b<<"|"<<*(b+1)<<"|"<<*(b+2)<<endl;

  结果是

abc
cde
fgh

  可以看出每一次内存地址的+1操作事实上是一次加sizeof(char*)的操作,我们在32位的系统中sizeof(char*)的长度是4,所以每加1也就是+4,实际上是*a[]内部三个位置的+1,所以*(b+1)的结果自然就是cde了,我们这时候可能会问,为什么输出是cde而不是c一个呢?答案是这样的,在c++中,输出字符指针就是输出字符串,程序会自动在遇到\0后停止.

  我们最后分析一下段2中的代码,段2中我们调用了print_array()这个函数,这个函数中形式参数是char *array[]和代码中的char *test[]一样,同为字符指针,当你把参数传递过来的时候,事实上不是把数组内容传递过来,test的首地址传递了进来,由于array是指针,所以在内存中它在栈区,具有变量一样的性质,可以为左值,所以我们输出写成了,cout<<*array++<<endl;当然我们也可以改写为cout<<array[i]<<endl,这里在循环中的每次加1操作和段1代码总的道理是一样的,注意看下面的图!

  到这里这两个非常重要的知识点我们都说完了,说归说,要想透彻理解希望读者多动手,多观察,熟能生巧。

  下面是内存结构示意图:



[1] >>继续下一页
相关文章:
分享到:
评论

相关推荐

    指针数组和数组指针的区别.doc

     下面我们来仔细说明一下字符指针数组和指向指针的指针,段1中的程序是下面的样子: char *a[]={"abc","cde","fgh"}; char* *b=a; cout*b|"*(b+1)|"*(b+2);  char *a[]定义了一个指针数组,注意不是char[], ...

    深入解析C++中的指针数组与指向指针的指针

    指针数组定义:如果一个 数组,其元素均为指针型数据,该数组为指针数组,也就是说,指针数组中的每一个元素相当于一...使用指针数组中各元素分别指向若干个字符串,使字符串的处理更加灵活。 程序1.1 代码如下:#inclu

    字符数组与字符指针

    字符数组与字符指针这两个概念在C/C++中非常重要,编程时会经常使用到,但是很多人容易错误使用!两者有相同地方,也要不同地方,本文详细介绍了两者的区别,能给读者一定的参考!

    学习C++指向字符数组的指针

     记住:在cout和多数C++表达式中,char数组名、指向char的指针以及用引号括起来的字符串常量都被解释为字符串第一个字符的地址.  5、无法使用string对象初始化char指针,但是string类提供了一个名为c_str的成员...

    C++第4章_数组与指针(C++课件,中南大学)

    1 数组及其简单应用 2 指针及其简单应用 3 指针与数组 4 字符串 5 指针数组与命令行参数 6 引用

    嵌入式C/C++语言开发精华文章集锦(嵌入式C/C++开发者必看,很有价值的文章)

    C++中extern "C"含义深层探索. C 语言高效编程的几招 想成为嵌入式程序员应知道的 0x10 个基本问题 C 语言嵌入式系统编程修炼之一:背景篇 C 语言嵌入式系统编程修炼之二:软件架构篇 C 语言嵌入式系统编程修炼之三:...

    C++课程-3_数组指针与字符串

    C++课程-3_数组指针与字符串 C++课程-3_数组指针与字符串

    C++中字符串以及数组和指针的互相使用讲解

    主要介绍了C++中字符串以及数组和指针的互相使用讲解,是C++入门学习中的基础知识,需要的朋友可以参考下

    C++中二维数组与指针关系的剖析.pdf

    C++中二维数组与指针关系的剖析.pdf

    c++指针 实例演练与提高

    21.1 简单变量、数组、指针 21.2 小王成绩管理系统V2.0 的问题 21.2.1 软件升级历史 21.3 指针的最常用用法 21.3.1 分配内存 ... 21.3.2 访问指针指向的内存 ... 21.6.4 字符串指针数组  

    谭浩强C语言教程Word版

    1 C语言概述 2&lt;br/&gt;1.1 C语言的发展过程 2&lt;br/&gt;1.2 当代最优秀的程序设计语言 2&lt;br/&gt;1.3 C语言版本 2&lt;br/&gt;1.4 C语言的特点 3&lt;br/&gt;1.5 面向对象的程序设计语言 3&lt;br/&gt;1.6 C和C++ 3&lt;br/&gt;1.7 简单的C程序介绍 4...

    数组、指针与字符串 C++编程

    c++实验课上做的代码,关于数组、指针与字符窜 整个实验报告都有

    C++ 课程作业 数组指针与字符串1——冒泡排序(函数指针,回调函数)

    如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。**回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,...

    cfcc-main.zip

    23.c //二维数组指针 24.c //秀秀指针 25.c //多级指针的应用 26.c //位运算 27.c //结构体变量 28.c //结构体指针 29.c //静态链表 30.c //动态链表 xiao3 31.c //共用体 32.c //文件的打开与关闭 33.c //文件的读...

    用c++比较两个字符串的大小

    使用指针和for循环来比较两个字符串大小 ,字符串即为一个字符数组

    字符串与指针

    字符串与指针

    编译原理pl\0词法分析程序

    扩充pl\0编译器设计之词法分析程序 内嵌函数: void clearToken(); //清空token字符数组 int isSpace();... //将读字符指针后退一个字符 void reserve(); //保留字 void lexical_error(); //错误处理过程

    格C/C++语言式化字符串

    C/C++语言格式化字符串 %d 十进制有符号整数 %u 十进制无符号整数 %f 浮点数 %s 字符串 %c 单个字符 %p 指针的值 %e 指数形式的浮点数 %x, %X 无符号以十六进制表示的整数 %0 无符号以八进制表示的整数 %g...

    C/C++程序员面试指南.杨国祥(带详细书签).pdf

    本书以流行的面试题讲解为主要内容,介绍了C、C++语言基本概念,包括保留字、字符串、指针和引用、结构体、库函数等各个方面的基础知识,介绍了面向对象编程基本概念,包括如何实现继承、多态和封装等。还介绍了排序...

    《C++语言程序设计》第六章_数组__指针与字符串

    用变量地址作为初值时,该变量必须在指针初始化之前已说明过,且变量类型应与指针类型一致。 可以用一个已赋初值的指针去初始化另一 个指针变量。 不要用一个内部 auto 变量去初始化 static 指针。

Global site tag (gtag.js) - Google Analytics