C語言char * char * a[] ,char ** str 字符串數組小結


 

 

#include <stdio.h>

int main()
{
/*char *a[];由於[]的優先級高於*所以a先和[]結合,他還是一個數組
//數組中的元素才是char *,所以是一個指針數組!!里面保存的是地址!
//可以看到數組中的四個元素保存了四個內存地址,這四個地址中就代表
//了四個字符串的首地址,而不是字符串本身。
注意這四個地址是不連續的,它是編譯器為"China","French","America","German"
分配的內存空間的地址, 所以,四個地址沒有關聯*/
int i ;
char * a[]={"China","French","America","German"};
char **s = a;
printf("數組名a的地址:%p,&a[0]即數組元素內存單元本身的地址:%p\n",a,&a[0]);
printf("*a=%s,a[0]=%s\n",*a,a[0]);
printf("a[0]保存的China的地址:%p a[1]保存French的地址:%p\na[2]保存America的地址:%p a[3]保c存German的地址:%p\n",a[0],a[1],a[2],a[3]);//數組元素中保存的地址,不連續
printf("sizeof(a)=%d\n",sizeof(a));
printf("數組元素單元本身的地址每個相差4:%p %p %p %p\n",&a[0],&a[1],&a[2],&a[3]);//數組元素單元本身的地址
//為什么能把 a賦給s,因為數組名a代表數組元素內存單元的首地址,
//即 a = &a[0] = 0012FF38;

printf("*s=%s\n",*s); //China
printf("a[0]=%s\n",a[0]);
printf("*a=%s\n",*a);
//但還是要注意,不能a = s,前面已經說到,a 是一個常量。
printf("*(s[0])=%c,*(s[1])=%c\n",*(s[0]),*(s[1]));//C F
printf("strlen(*s)=%d,strlen(s[1])=%d,strlen(*(s+1))=%d\n",strlen(*s),strlen(s[1]),strlen(*(s+1)));
printf("*(s+1)=%s\n",*(s+1));

for( i=0;i<strlen(s[0]);i++)
{
printf("%c ",*(*(s+0)+i));
//printf("%c ",a[0][i]);//2中方法
}
/*
char **s = "hello world";
這樣是錯誤的, 因為 s 的類型是 char ** 而 "hello world "的類型是 char *
雖然都是地址, 但是指向的類型不一樣,因此,不能這樣用。,從其本質來分析,"hello world",代表一個地址,
比如0x003001,這個地址中的內容是 'h' ,為 char 型,而 s 也保存一個地址 ,這個地址中的內容(*s) 是char * ,
是一個指針類型, 所以兩者類型是不一樣的。 。。*/



}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM