本文為學(xué)習(xí)使用
在C語言中任意的同類型指針都可以比較大小
指針變量是一個(gè)表示[內(nèi)存地址]的長整數(shù)而已,當(dāng)然可以比較。指向同一個(gè)數(shù)組時(shí),兩個(gè)指針的大小就表示誰指向的元素靠前或靠后。如果不是指向同一個(gè)數(shù)組,比較大小就只能看出誰指向的內(nèi)存空間地址較小,沒什么意義。數(shù)組名不代表整個(gè)數(shù)組,而代表數(shù)組首元素的地址,輸入字符數(shù)組,可用
cin>> 數(shù)組名;char s[]="china"; char * p; p=s;p與s不同若*p=a;
p[i],a[i];//用法一致
(p+i),(a+i);//用法一致
但p為變量,a為常量
補(bǔ)充:指針P+1 = 指針P + sizeof(指針的類型) * 1
int main(void)
{
int a[10] = {0,1,2,3,4,5,6,7,8,9}, *p = a+3;
printf("%d", p[2]);
return 0;
}//輸出5
- 詭異的字符串
- 輸出字符數(shù)組或字符串,只需cout<<"數(shù)組名"遇\0自動(dòng)結(jié)束輸出
-
char s[]="china"; char * p; p=s只需cout<<p,遇\0自動(dòng)結(jié)束輸出
還要注意,s數(shù)組長度包括 '\0',p所指向的字符串長度不包括 '\0',p的內(nèi)容為s[0] - 有時(shí)候可能會(huì)出現(xiàn)自己未賦值的元素被系統(tǒng)賦值為非'\0'
-
cout<<"abcd"+1;輸出bcd -
注意
char b[111][1000],*m; m=b[0];//此時(shí)b[0]是一個(gè)字符串名,是一個(gè)地址 char a[111],*m; m=&a[0];//此時(shí)a[0]是一個(gè)字符,是變量名 -
char *language[]={"FORTRAN","BASIC","PASCAL","JAVA","C"};則表達(dá)式*language[1]>*language[3]比較的是( )
language是一個(gè)字符指針數(shù)組,language[1]是這個(gè)數(shù)組中的第二個(gè)元素,也就是指向B,*language[1]表示取這個(gè)字符指針的值,也就是B。最后就是B和J做比較。
- 有時(shí)候要注意是指針還是乘號(hào)
int a[12] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }, *p[4], i;
for (i = 0; i < 4; i++)
p[i] = &a[i*3];
printf("%d\n", p[1][0]);
這樣可以使得*p[4]變成一個(gè)二維數(shù)組
*(p[i] + i) = 1 ; // p[i][i] == a[i][i]對(duì)角線上的元素賦值1
*(p[i] + 4 - (i + 1)) = 1; //p[i][3-i] == a[i][3-i]另一對(duì)角線上的元素賦值1
當(dāng)需要判斷
*p所指向元素是否存在
使用while(*p)更好
while(p)可能會(huì)出錯(cuò)//不過,準(zhǔn)確來說,這兩個(gè)都可能出錯(cuò)void指針:指向任何類型數(shù)據(jù)的指針可直接賦值給一個(gè)void指針,但不能將void指針直接賦給非void型指針變量,必須強(qiáng)制進(jìn)行類型轉(zhuǎn)換。實(shí)際使用void指針時(shí),要對(duì)它進(jìn)行類型轉(zhuǎn)換
優(yōu)先級(jí)問題
1.成員運(yùn)算符“.”優(yōu)先于“ * ”,所以當(dāng)p指向一個(gè)結(jié)構(gòu)體變量時(shí),(*p).name;
2.[ ]比 * 優(yōu)先級(jí)高,當(dāng)表示指針數(shù)組時(shí),應(yīng)為int * p[4]
3.注意 * 與自增自減運(yùn)算符優(yōu)先級(jí)一致。
4.指向函數(shù)的指針,與返回指針值的函數(shù)的括位置要注意。
如果有錯(cuò)誤的地方,歡迎指正喲。