zoukankan      html  css  js  c++  java
  • char[]数组与char *指针的区别

    char[]数组与char *指针的区别

    问题描述

    虽然很久之前有看过关于char指针和char数组的区别,但是当时没有系统的整理,到现在频繁遇到,在string,char[], char *中迷失了。由于string涉及的内容很多,因此本文中就先不整理了,对char[]和
    char *进行了一个整理,原理可能还是不太明白,但至少印象深刻了很多。

    整型数组和整型指针

    在讨论字符数组、字符指针以及字符串之前,先看下整型数组与整型指针的区别

        int a[]={1,2,3};//整型数组,a的指向不能改变,但数组的内容可以改变
        int *p = a;//整型指针,可以改变指向
    
        //resetiosflags(ios::right)<<setw(12)用来设置右对齐的格式
        cout<<"a = "<<resetiosflags(ios::right)<<setw(12)<<a<<endl;//输出结果为a在内存中的位置
        cout<<"&a = "<<resetiosflags(ios::right)<<setw(11)<<&a<<endl;//对数组名取地址,结果同上
        cout<<"p = "<<resetiosflags(ios::right)<<setw(12)<<p<<endl;//输出结果与a一致
        cout<<"&p = "<<resetiosflags(ios::right)<<setw(11)<<&p<<endl;
        cout<<"&a[0] = "<<resetiosflags(ios::right)<<setw(7)<<&a[0]<<endl;//数组第一个元素的地址
    

    enter description here
    从结果可以看出,整型数组名和对数组名用取地址"&"运算符得到的结果是一致的,其结果与数组的首个元素在内容在的地址相同;但对于整型指针,两者的值有所不同

        cout<<"*a = "<<*a<<endl;
        cout<<"*p = "<<*p<<endl;
    
        cout<<"&(*a) = "<<&(*a)<<endl;
        cout<<"&(*p) = "<<&(*p)<<endl;
    
        cout<<"*(&a) = "<<*(&a)<<endl;
        cout<<"*(&p) = "<<*(&p)<<endl;
    
    

    enter description here

    此处* a代表的是a指向的数组的第一个元素的值,* p 与* a 相同
    对* a和* p取地址得到的实际上就是数组的地址
    &a和&p已经是地址了,
    加上* 得到的结果对于数组名而言,是数组的地址,对指针p而言,是其指向的内容的地址

    void f1(int arr[])//与 f1(int *arr)在本质上一致
    {
        cout<<"In f1 sizeof(arr) is: "
            <<sizeof(arr)<<endl;//这个时候,虽然传入的是数组,但是arr自动退化为指针
    }
    
        cout<<"In main sizeof(a) is: "<<sizeof(a)<<endl;//输出12,即整个数组的大小
        cout<<"In main sizeof(p) is: "<<sizeof(p)<<endl;//输出4,即整型指针的大小
        f1(a);
        
        if (a== p)//用==对a和p进行比较时,两者是相同的
        {
            cout<<"a == p "<<endl;
        }
        else
            cout<<"a != p "<<endl;
    

    对数组名和指针名用sizeof的结果如下
    enter description here

    总的来说,在整型数组中,数组名相当于指向数组首元素的指针,但其指向不可改变。当将一个数组作为参数传递给函数时,实际传入的是指针。

    字符数组和字符指针

    首先定义两个字符数组和两个字符指针

        char ch1[] = "hello world";//字符数组
        char ch2[] = "hello world";
        char * ch3 = "hello world";//字符指针
        char * ch4 = "hello world";
    

    然后对数组以及指针进行一系列的输出

    1. 输出字符数组的名和指针名

        //这四个语句的输入是相同的
        cout<<"ch1 = "<<ch1<<endl;//输出的是整个字符数组的内容
        cout<<"ch2 = "<<ch2<<endl;//同上
        cout<<"ch3 = "<<ch3<<endl;//输出的指针指向的整个区域的值
        cout<<"ch4 = "<<ch4<<endl;
    

    输出字符数组的名和指针名的结果如下图所示
    输出数组名和指针名结果
    从输出结果可以看到与整型数组和整型指针的输出结果完全不同,在整型数组和整型指针的情况下,输出的是内存中的地址,字符串数组名输出的结果是整个字符串数组的内容,字符串指针输出的内容是所指向的字符串的所有内容。

    1. 对数组和指针名取地址

       cout<<"&ch1 = "<<&ch1<<endl;//每个指针各自在内存中的地址
       cout<<"&ch2 = "<<&ch2<<endl;
       cout<<"&ch3 = "<<&ch3<<endl;
       cout<<"&ch4 = "<<&ch4<<endl;
    

    对字符数组和字符指针取地址后的输入结果如下图
    enter description here
    从结果可以看出,输出的是每个指针各自的地址(数组名实质上就是指向数组首地址的指针)

    1. 对首元素去地址

       cout<<"&ch1[0] = "<<&ch1[0]<<endl;//输出的结果是整个字符串数组
       cout<<"&ch2[0] = "<<&ch2[0]<<endl;//同上
       cout<<"&ch3[0] = "<<&ch3[0]<<endl;//同上
       cout<<"&ch4[0] = "<<&ch4[0]<<endl;//同上
    

    在整型数组中,&a[0]的输出结果是数组的首地址,在字符串中,结果却不是
    enter description here
    由结果可知,字符数组的第一个元素取地址的结果输出的却是整个字符串

    1. 对数组名和指针用* ,同时对首元素取地址后用*

       cout<<"*ch1 = "<<*ch1<<endl;
       cout<<"*ch2 = "<<*ch2<<endl;
       cout<<"*ch3 = "<<*ch3<<endl;
       cout<<"*ch4 = "<<*ch4<<endl;
       
       cout<<"*(&ch1[0]) = "<<*(&ch1[0])<<endl;
       cout<<"*(&ch2[0]) = "<<*(&ch2[0])<<endl;
       cout<<"*(&ch3[0]) = "<<*(&ch3[0])<<endl;
       cout<<"*(&ch4[0]) = "<<*(&ch4[0])<<endl;
    

    enter description here
    结果比较好理解,就是字符数组的第一个字符

    1. &和* 同时使用

       cout<<"&(*ch1) = "<<&(*ch1)<<endl;
       cout<<"&(*ch2) = "<<&(*ch2)<<endl;
       cout<<"&(*ch3) = "<<&(*ch3)<<endl;
       cout<<"&(*ch4) = "<<&(*ch4)<<endl;
    
    
       cout<<"*(&ch1) = "<<*(&ch1) <<endl;
       cout<<"*(&ch2) = "<<*(&ch2) <<endl;
       cout<<"*(&ch3) = "<<*(&ch3) <<endl;
       cout<<"*(&ch4) = "<<*(&ch4) <<endl;
    

    enter description here
    输出的结果是整个字符数组,和整型的情况又不同

    1. 用==和strcmp比较

       if (ch1== ch2)
           cout<<"ch1== ch2"<<endl;
       else
           cout<<"ch1 != ch2"<<endl;
    
       if (ch3== ch4)
           cout<<"ch3== ch4"<<endl;
       else
           cout<<"ch3 != ch4"<<endl;
    
       if (strcmp(ch1,ch2) == 0 )
           cout<<"Using strcmp, ch1 = ch2"<<endl;
       else
           cout<<"ch3 != ch4"<<endl;
    

    enter description here
    由于ch1和ch2s是两个不同的数组,所以用== 判断的返回结果为假
    ch3和ch4是两个指针,其指向内容相同,因此用== 判断返回值为真
    strcmp比较的只是数组的内容,ch1与ch2的内容是相同的

  • 相关阅读:
    觅踪8
    觅踪7
    团队开发进度报告1
    团队计划会议
    团队nabcd卡片制作及小组讨论
    团队项目NABCD
    软件需求分析
    团队电梯演讲视频
    团队开篇博客
    团队简介
  • 原文地址:https://www.cnblogs.com/scut-linmaojiang/p/4742617.html
Copyright © 2011-2022 走看看