解析char *p与char p[] , char (*p)[]与char *p[]

主要解析的问题:

问题1:
#include <cstdio>
#include <iostream>
using namespace std;
char *string1()
{
    char p[] = "hello world!";
    return p;
}
char *string2()
{
    char *p = "hello world!";
    return p;
}
int main()
{
    char *p;
    p = string1();
    cout<<"string1:"<<p<<endl;
    p = string2();
    cout<<"string2:"<<p<<endl;
    return 0;
}




输出:
           string1:(乱码或者没有输出),linux下没有任何输出
           string2:hello world!

问题2:
            char *p = "hello world!";

            这样写到底合不合法,实际应用中能不能这样写。

问题3:
            char *p = "hello world!";

            char p[]="hello world!";

            有什么细节和操作上的差异。

解析:
            char *p = "hello world!";

            char p[] = "hello world!";

            两者都用来声明一个字符串,并将其初始化为hello world!,但是表示的意义确是大不相同。


       从其声明的对象来说:


             char p[] = "hello world!";

                        用来声明一个数组p,数组大小为12字节。


            char *p = "hello world!";

                       用来声明一个指针p,指向“hello world!”字符串起始位置。


       从存储位置来说:


             char p[] = "hello world!";

                        p数组作为局部变量被存储在栈区;


             char *p = "hello world!";

                       在这个声明中,"hello world!"被存储在静态数据区,而且是全局的,

                       p仅仅就是个指针,指向这个区域。不信的话你可以试试下边的代码,看是不是同一个地址:


            char *p1 = "hello world!";
            char *p2 = "hello world!";
            printf("p1:%x\np2:%x\n",p1,p2);


       从函数执行后的扫尾工作来看:


           C函数执行完之后对栈区进行清除操作,对静态数据区和堆则没有,

           因此第一个问题也就不难解释了,string1()函数执行完就释放了栈区内存,

           所以根本就不存在存有"hello world!"声明时的内存,也就不可能有所输出。

        那么,写成char *p = "hello world!";到底合不合法呢?能不能这样写呢?


                   这是一个历史问题,在const关键字被引入C语言之前,这样写是合法的,而且存在了很长的一段时间,

            大量的代码在此期间运用了这种写法,新版C语言为了兼容,故允许这样写,但最好不要这样,

            因为这种写法终会被淘汰,说不定哪天你的代码用了新版的编译器,

            然后莫名的出了问题,要找这个BUG估计不是一件容易的事。

 

现在最好写成:


        const char *p = "hello world!";
或者
        char p[] = "hello world!";


        那他们在操作和细节上有什么区别呢?
        区别很多,由于本人才疏学浅,只总结出以下几点,忘有知者补充:
        1. char *p = "hello world!"; 可以用p++操作,sizeof(p) == 4;
        2.char p[]="hello world!"; sizeof(p) == 12;

 

 

 

 

记得以前经常搞不清楚char (*p)[]跟char *p[],于是就写了以下的测试程序。


char p[] = "hello,world";

                是对字符串"hello,world"做了拷贝,所以可以对拷贝字符串做任意修改

char *p = "hello,world";

                  字符串常量将自己在静态存储区中的地址赋给了p指针


char (*p)[SIZE]:

指向一维数组的指针,一维数组只能有SIZE个元素。代码如下:

#include <stdio.h>
#define TESTSIZE 20
int main(void)
{
    char szTest[][TESTSIZE] = {"hello", "world"};
    char (*p)[TESTSIZE];

    p = szTest;
    for(int i = 0; i < sizeof(szTEST)/TESTSIZE; i++)
    {
        printf("%s", p + i);
    }
}


 

char *p[SIZE]:指针数组,数组有SIZE个元素。代码如下:

#include <stdio.h>
#define STRSIZE 20

int main(void)
{
     char *p[] = {"hello", "world!"};                //p[],数组
     for(int i = 0; i < 2; i++)
         printf("%s ", p[i]);

     return 0;
}


 点击打开链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值