char* str 与 char str[]

char* str = "HelloWorld"

  • "HelloWorld"字符串存储在全局静态只读区域,通过str修改任何一个字符是非法操作 (str[0] = 'h';//非法操作)

例程

#include 

void printhello(void)
{
    char *ptr1 = "HelloWorld";
    std::cout << "ptr1 address: "<< (void*)ptr1 << std::endl;
}

void printword(void)
{
    char *ptr2 = "HelloWorld";
    std::cout << "ptr2 address: "<< (void*)ptr2 << std::endl;
}

int main()
{
    printhello();
    printword();
    char *str1 = "HelloWorld";
    char *str2 = "HelloWorld";
    std::cout << "str1 address: " << (void*)str1 << std::endl;
    std::cout << "str2 address: " << (void*)str2 << std::endl;
    std::cout << "str1 " << ((str1 == str2) ? "equal to " : "unequal to ")
        << "str2" << std::endl;
    return 0;
}
//本人电脑的输出
ptr1 address: 00953138
ptr2 address: 00953138
str1 address: 00953138
str2 address: 00953138
str1 equal to str2

通过上面的例程,可以看出ptr1,ptr2,str1,str2全部指向同一块内存空间

char str[] = "HelloWorld"

  • "HelloWorld"存储在栈中,相当于char str[11] ="HelloWorld";
  • 可以通过str修改"HelloWorld中的内容"(str[0] = 'h';//合法)

例程

#include 

int main()
{
    char str1[] = "HelloWorld";
    char str2[] = "HelloWorld";
    std::cout << "str1 "<< ((str1 == str2) ? "equal to " : "unequal to ")
        <<"str2"<< std::endl;
    std::cout << "str1 address: "<< (void*)str1 << std::endl;
    std::cout << "str2 address: "<< (void*)str2 << std::endl;
    str1[0] = 'h';
    std::cout << str1 << std::endl;
    return 0;
}
//输出结果
str1 unequal to str2
str1 address: 00F3FE6C
str2 address: 00F3FE78
helloWorld

通过上面例程可以看出str1与str2指向不同的内存地址,且可以随意更改str1所指向的内存里的内容(str2也是一样)。

void foo(char* p) 与 void foo(char p[])形参

  • 形参没有任何区别,都是要去传入一个char型指针

例程

#include 
void foo(char* p)
{
    p[0] = 'h';
    std::cout << p << std::endl;
    std::cout << (void*)p << std::endl;
}

void foo2(char p[])
{
    p[0] = 'w';
    std::cout << p << std::endl;
    std::cout << (void*)p << std::endl;
}

int main()
{
    //foo("HelloWorld"); //调用函数会产生错误
    //foo2("HelloWorld");
    char str[] = "HelloWorld";
    foo(str);
    foo2(str);
    system("pause");
    return 0;
}
//输出的结果
helloWorld
00D3FD9C
welloWorld
00D3FD9C

你可能感兴趣的:(char* str 与 char str[])