指標算術運算有三種:指標加數字、指標減數字、指標減指標。
①指標加減數字
指標加減法需要調整指標,調整的權重是指標本身清楚乙個*號,在求sizeof()的長度。
eg:int main()
②指標減指標合法(指標加指標不合法)
a,算出兩個指標間隔的位元組數,
b,除以調整的權重,調整的權重是指標本身去掉乙個*號,再求sizeof()
注意:不同型別指標不能相減
eg:int main()
;//位元組長度總共為40
int *p = &arr[1];//長度為4
int *q = &arr[9];//長度為36
printf("%d\n",p-q);//(4-36)/4=-8
printf("%d\n",q-p);//8
printf("%d\n",(short *)q-(short *)p);//(36-4)/2=16
printf("%d\n",(char **)q-(char **)p);//(36-4)/4=8
printf("%d\n",(double *)q-(double *)p);//32/8=4
printf("%d\n",(long *)q-(long *)p);//32/8=4
printf("%d\n",(char *)q-(char*)p);//32/1=32
printf("%d\n",(long long)q-(long long)p);//不是指標,故而直接相減36-4
//printf("%d\n",(int *)q-(short *)p);//error,不同型別不能相減。
return 0;}
指標與陣列的關係:
指標與陣列首元素等價。
eg:*(arr+i) == arr[i]
p[i] == *(p+i)
**分析:
void initarr(int *arr,int len)
}int main()
; int *p = arr;
printf("%d,%d,%d\n",*(p+3),*(arr+3),arr[3]);//*(p+3)等價於*p[3]==4; *(arr+3)等價於arr[3]等價於p[3]==4; arr[3]==p[3]==4;
p = &arr[5];//p指向arr[5]的位址
printf("%d\n",p[-2]);//*(p-2); 則p[-2]表
//p此時指向p[5],
示p[5-2]==p[3]==4
initarr(arr,sizeof(arr)/sizeof(arr[0]));//呼叫
initarr函式。
return 0;}
*p與arr的區別:
以下為例
int arr[10]=;
int *p=arr;
①位元組長度不同,sizeof(arr[10])=40; sizeof(*p)=4;
②指標可以實現指標++,但是陣列不可以++,即*p++合法,arr++非法。
算術運算和陣列
因為短是2個位元組,每個位址不同於2。很難得看到 和 用這樣的方式與指標運算子。然而,更常見的是看到 或 運算元被用來增加或減少乙個指標指向陣列中的下乙個或前乙個元素。指標的算術運算和陣列 如果是乙個指標,指向陣列的第乙個元素 元素0 的陣列,並新增1到指標已經返回下乙個物件,然後排列 1點必須到二...
指標運算 算術運算 關係運算
是不是對指標的任何運算都是合法的呢?答案是它可以執行某些運算,但並非所有的運算都合法。除了加法運算之外,你還可以對指標執行一些其他運算,但並不是很多。指標加上乙個整數的結果是另乙個指標。問題是,它指向 如果你將乙個字元指標加1,運算結果產生的指標指向記憶體中的下乙個字元。float佔據的記憶體空間不...
指標運算 算術運算 關係運算
是不是對指標的任何運算都是合法的呢?答案是它可以執行某些運算,但並非所有的運算都合法。除了加法運算之外,你還可以對指標執行一些其他運算,但並不是很多。指標加上乙個整數的結果是另乙個指標。問題是,它指向 如果你將乙個字元指標加1,運算結果產生的指標指向記憶體中的下乙個字元。float佔據的記憶體空間不...