在c語言中,通常有兩種方式來建立字符串ios
//第一種,利用字符指針 char* p = "hello"; //第二種:利用字符數組 char str[] = "hello";
那麼,它們之間有什麼區別呢?以例子說明:數組
#include<stdio.h> #include<iostream> char* returnStr() { char* p = "hello world!"; return p; } int main() { char* str = NULL; str = returnStr(); printf("%s\n", str); system("pause"); return 0; }
輸出:函數
以上代碼是沒有問題的,"hello world"是一個字符串常量,存儲在常量區,p指針指向該常量的首字符的地址,當returnStr函數退出時,常量區中仍然存在該常量,所以仍然能夠用指針訪問到。spa
#include<stdio.h> #include<iostream> char* returnStr() { char p[] = "hello world!"; return p; } int main() { char* str = NULL; str = returnStr(); printf("%s\n", str); system("pause"); return 0; }
輸出:指針
以上代碼有問題,輸出爲亂碼。這一段代碼和以前的最主要的區別就是returnStr中字符串的定義不一樣。這裏使用字符數組定義字符串。所以這裏的字符串並非一個字符串常量,該字符串爲局部變量,存查在棧中,當returnStr函數退出時,該字符串就被釋放了,所以再利用指針進行訪問時就會訪問不到,輸出一堆亂碼。code
固然 ,若是將char p[] = "hello world!";聲明爲全局變量,即:blog
#include<stdio.h> #include<iostream> char p[] = "hello world!"; char* returnStr() { return p; } int main() { char* str = NULL; str = returnStr(); printf("%s\n", str); system("pause"); return 0; }
那麼,該字符串就會存儲在全局變量區,通常將全局變量區和靜態資源區和常量區視爲一個內存空間。所以,一樣能夠使用指針訪問到。內存
輸出:資源