一、字符指針、字符數組
1. 字符指針:字符串指針變量本身是一個變量,用於存放字符串的首地址。而字符串本身是存放在以該首地址為首的一塊連續的內存空間中並以‘\0’作為串的結束。
char *ps="C Language"; 順序是:1.分配內存給字符指針;2.分配內存給字符串;3.將字符串首地址賦值給字符指針;
可以寫為:
char *ps; #ps字符串指針,是指針,是一個變量,
ps="C Language"; #ps為字符串的首地址,利用ps++可遍歷字符串,字符串存儲在以ps為開始地址的地段連續的內存空間中,並以'\0'作為字符串的結束。
這里有兩點需要注意:
①定義字符指針char *a中,*a只是指向一個字符。舉例如下:
#include<stdio.h>
int main(){
char *a= "bcd" ;
printf("輸出字符:%c\n",*a); //輸出字符
printf("輸出字符:%c\n",*(a+1)); //輸出字符/
printf("輸出字符串:%s\n",a); //輸出字符串
}
運行結果如下:
②若字符串常量出現在在表達式中,代表的值為該字符串常量的第一個字符的地址。
char *a; a="hello";
這里字符串"hello"僅僅代表其第一個字符的地址。
2. 字符數組:字符數組是由於若干個數組元素(一個個字符)組成的,它可用來存放整個字符串。(即用字符數組來存放字符串)。
在c語言中,將字符串作為字符數組來處理。(c++中不是)
字符數組初始化的方法:
1). 可以用字符串常量來初始化字符數組:char str[]={"Iamhappy"}; //可以省略花括號
char str[]="Iamhappy"; //系統自動加入‘\0’
注意:上述這種字符數組的整體賦值只能在字符數組初始化時使用,不能用於字符數組的賦值,字符數組的賦值只能對其元素一一賦值。
下面的兩種賦值方法都是錯誤的:
char str[20];
str="Iamhappy";
對字符數組的各元素逐個賦值:
char str[20]
str[8]={'I','','a','m','',‘h’,'a','p','p','y'};
在C語言中,可以用兩種方法表示和存放字符串:
(1)用字符數組存放一個字符串
char str[]="IloveChina";
(2)用字符指針指向一個字符串
char *str="IloveChina";
兩種表示方式的字符串輸出都用:printf(“%s\n”, str);
%s表示輸出一個字符串,給出字符指針變量名str(對於第一種表示方法,字符數組名即是字符數組的首地址,與第二種中的指針意義是一致的),
則系統先輸出它所指向的一個字符,然后使str自動加1,使之指向下一個字符...,如此,直到遇到字符串結束標識符"\0"。
二、(字符串)指針數組
#include <stdio.h>
void main()
{
char *str[] = {"Hello", "C++", "World"};
int i;
for(i=0; i<3; i++)
printf("%s\n", str[i]);
}
或
#include <stdio.h>
int main(){
char *str[] = {"hellow","C++","World"};
printf("%s,%s,%s\n",str[0],str[0]+1,*str);
printf("%c,%s,%c,%c,%s\n",**str,*str+2,*str[2],**(str+2),*(str+2));
}
運行結果為:
其中,str[i]為數組中第i+1個字符串的首地址,*str為數組第一個字符串的首地址,也即數組第一個字符串的第一個字符的地址,*str+i為數組第一個字符串中第i+1個字符的地址,
str[i]+j為數組第i個字符串中第j+1個字符的地址,str[k]=*(str+k)為數組中第k+1個字符串的首地址。
或
#include <stdio.h>
int main()
{
char *str[] = {"Hello", "C++", "World"};
char **p;
p=str;
printf("%c,%c\n",*p[0],*(p[2]+1));
for(; p<str+3; p++)
printf("%s\n",*p);
}
運行結果為:
其中,p為char類型指向指針的指針,第一個指針p包含了第二個指針*p的地址,第二個指針*p指向包含實際值的位置。
p[i]找到字符數組中第i+1個字符串,並指向第i+1個字符串的首地址;*p[i]做取值操作,p[i]+j為數組第i個字符串中第j+1個字符的地址。
總的來說,對於char *a[],a是數組,數組中的元素是指針,指向char類型,(數組里面所有的元素是連續的內存存放的);
數組名是數組第一個字節的內存地址,並且數組名a也表示指針。所以a 並不表示a地址存儲的內容, 而是a地址本身。
三、