C:深入 char 、char * 、char ** 、char a[ ] 、char *a[]

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個元素,其中每個元素都是一個指向整型對象的指針。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章