一、字符指針、字符數組
1. 字符指針:字符串指針變量本身是一個變量,用於存放字符串的首地址。而字符串本身是存放在以該首地址為首的一塊連續的內存空間中並以‘\0’作為串的結束。
char *ps="C Language"; 順序是:1.分配內存給字符指針;2.分配內存給字符串;3.將字符串首地址賦值給字符指針;
可以寫為:
char *ps; #ps字符串指針,是指針,是一個變量,
ps="C Language"; #ps為字符串的首地址,利用ps++可遍歷字符串,字符串存儲在以ps為開始地址的地段連續的內存空間中,並以'\0'作為字符串的結束。
這里有兩點需要考慮清楚的地方:①*a只是指向一個字符。舉例如下:
1.#include <stdio.h>
2.#include <stdlib.h>
3.
5.char *a= "bcd" ;
6.printf("輸出字符:%c /n", *a); /*輸出字符,使用"%c"*/<br>
printf("輸出字符:%c /n", *(a+1) ); /*輸出字符,使用"%c"*/
7.printf("輸出字符串:%s /n", a); /*輸出字符串,使用"%s";而且a之前不能有星號"*" */
8.system("pause"); /*為了能看到輸出結果*/
9.}
10./*運行結果如下:
11.輸出字符:b<br>輸出字符:c
12.輸出字符串:bcd*/
②若字符串常量出現在在表達式中,代表的值為該字符串常量的第一個字符的地址。所以”hello”僅僅代表的是其地址。原聲明方式相當於以下聲明方式:
1.char *a;
2.a="hello";/*這里字符串"hello"僅僅代表其第一個字符的地址*/
2. 字符數組:字符數組是由於若干個數組元素組成的,它可用來存放整個字符串。(即用字符數組來存放字符串)。
在c語言中,將字符串作為字符數組來處理。(c++中不是)
字符數組初始化的方法:
1). 可以用字符串常量來初始化字符數組:char str[]={"Iamhappy"}; 可以省略花括號
char str[]="Iamhappy"; #系統自動加入‘\0’
注意:上述這種字符數組的整體賦值只能在字符數組初始化時使用,不能用於字符數組的賦值,字符數組的賦值只能對其元素一一賦值。
下面的賦值方法是錯誤的:
char str[20];
str="Iamhappy";
對字符數組的各元素逐個賦值。
char str[10]={'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"。
二、字符串指針
string* str可以賦值string* str = {"hello", "world"};//對比與char *name = "wang" = {'w','a','n','g'}
//?? *(str) = "hello", *(str+1) = "world"
//?? *(*(str)+1) = 'e',
也就是說每個元素都是string類型的,跟char*是不一樣的,不過string*可以用char**來代替//string = char*, string* = char**
三、(字符串)指針數組
#include <stdio.h>
void main()
{
char *str[] = {"Hello", "C++", "World"};//char (*str)[] = ...
int i;
for(i=0; i<3; i++)
printf("%s\n", str[i]);
} #str[0]字符串“hello”的首地址,str[0]+1:字符串“hello”第二個字符‘e’的地址,str[2]=str+2:第三個字符串“world”的首地址
#str[1]字符串“C++”的首地址
#str[2]字符串“world”的首地址
或
#include <stdio.h>
#include <string.h>
void main()
{
char *str[] = {"Hello", "C++", "World"};
char **p;
for(p=str; p<str+3; p++)
puts(*p); #*p為字符串首地址,*p[0]為字符串的第一個字符地址
}
#include<stdio.h>
#include<stdlib.h>
main()
{
char *str[3]={"Hello","C++","World"};
printf("%s,%s,%c",str[0],str[0]+1,*(*(str+2)+1));
system("pause");
}
結果為:
Hello,ello,o
格式:char* na[N] = {"li", "zh", "li", "zh", "li"};
char *a[]:表示a是數組,數組中的元素是指針,指向char類型,(數組里面所有的元素是連續的內存存放的)
數組名是數組第一個字節的內存地址,並且數組名a也表示指針。所以a 並不表示a地址存儲的內容, 而是a地址本身。
int main(int argc, char*argv[])
這是一個典型的數組名(或者說是指針數組)做函數參數的例子,而且還是沒有指定大小的形參數組。
有時為了再被調用函數中處理數組元素的需要,可以另設一個形參,傳遞需要處理的數組元素的個數。而且用數組名做函數實參時,不是吧數組元素的值傳遞給形參,而是把實參數組的首元素的地址傳遞給形參數組,這樣兩個數組久共同占有同一內存單元。 和變量作函數參數的作用不一樣。
可以去看看關於數組作為函數參數和指針數組作main函數形參方面的例子。譚浩強的那本書講的很細,對這個有詳細的解釋。