REF : https://blog.csdn.net/daiyutage/article/details/8604720
二級指針保存的是一級指針的地址,它的類型是指針變量,而一級指針保存的是指向數據所在的內存單元的地址,雖然都是地址,但是類型是不一樣的。
char ch=‘a’; //定義一個字符變量-單引號,變量名爲ch,並進行初始化。
char str[]=“abcd”; //定義一個字符數組-雙引號,數組名爲str,並進行初始化。
char *和char[]的初始化
char* str1 = "abcd";
char str2[] = "abcd";
在調用reverse函數時. 從形式上 reverse(str1,5) 和reverse(str2, 5)都沒有錯誤,傳入的參數都是char數組的頭指針,但是實際操作時,不能採取str1的初始化形式。
char* str1 ="abcd"
含義是先新建一個字符串,內容是abcd 然後str1是一個頭指針,指向這個串. 但是這個新建串是作爲const存在的,並不是一個可以編輯的變量,因此,一旦你想更改其中的值,程序就會掛掉.
相應的
char *str1 = (char*)malloc(5*sizeof(char));
str1 = "abcd";
相當於開闢一個5個長度的數組,頭指針是str1,但是第二句又把str1指向的位置變了,之後還是不能操作str1的內容.
...............................................................................................................................................................................................................................................................................................
char str2[] = "abcd" < sizeof(str2) = 5 : a b c d \0 >
這個的含義是在內存中開闢一個數組,然後向該數組中填充"abcd", 是一個可操作的變量。
引申應用:https://blog.csdn.net/slam_navigation/article/details/77651140
char argv, char argv[ ], char* argv, char argv[ ][ ], char * argv[ ], char** argv, char (*argv)[ ]
const char argv[6]=”china”或{“c”,”h”,”i”,”n”,”a”,”\o”};
const char * argv =”china”;
這兩種初始化方式是等價的。
主要差別在於:
-
數組名argv是一個常量(數組名就是數組首元素的地址);
-
指針argv是一個變量(所以可以使用增量運算符,而數組名不可以),這個變量初始化的時候指向字符串的第一個字符,*argv=”c” ;
printf(“%s”,argv))輸出字符串;
printf(“%c”,*argv)輸出一個字符;
兩者區別如下:
一、 ”讀“ ”寫“ 能力
const char * argv =”china” 此時”china”存放在常量區。通過指針只可以訪問字符串常量,而不可以改變它。
const char argv[6]=”china” 此時 “china”存放在棧。可以通過指針去訪問和修改數組內容。
二.、賦值時刻
const char * argv =”china” 是在編譯時就確定了(因爲爲常量)。
const char argv[6]=”china” 在運行時確定。
三.、存取效率
const char * argv =”china” 存於靜態存儲區。在棧上的數組比指針所指向字符串快,因此慢 。
const char argv[6]=”china” 存於棧上,快。
const char argv[3][8] = {“china”,”student”,”BUAA”};
const char *argv[3] = {“china”,”student”,”BUAA”};
前者是典型的二維數組(argv[0] = “china”, argv[1] =”student”, argv[2] =”BUAA”)。
後者是指針數組(指向char的指針組成的數組,此時的argv是個一維數組,數組裏面的每一個元素都是一個char類型值的地址,第一個指針是argv[0],它是指向第一個字符串的第一個字符,第二個指針是argv[1],它是指向第二個字符串的第一個字符,後面以此類推。 argv數組實際上並不存放字符串,它只是存放字符串的地址(字符串存在程序用來存放常量的那部分內存中)。
可以把argv[0]看作表示第一個字符串:
*argv[0]看成表示第一個字符串的第一個字符。
printf(“%s”,argv[i]))輸出字符串
printf(“%c”,*argv[i])輸出一個字符)
-
char (*argv)[3]表示argv是指向含有3個char型的數組的指針
-
const char *argv[] 和 const char **argv,它倆有等價的效果(關係類似於char argv[ ]和 char* argv)
二維數組函數參數:(傳的是地址)
void Func(int array[3][10]);
void Func(int array[ ][10]);
void Func(int (*array)[10]); 注意*array需要用括號括起來
void Func(int *array[10]);這種形式的聲明參數是一個指針,它指向具有10個元素的一維數組。參數相當於是聲明瞭一個數組,該數組有10個元素,其中每個元素都是一個指向整型對象的指針。