指针运算(自己做个笔记)
1,指針+1 地址變化
#include <stdio.h>
int main(){int a[]={0,1,2,3,4,5,6};int *p=a;int *p1=p+1;printf("p = %p\n",p);printf("p1 = %p",p1);return 0;
} 輸出:
p = 000000000062FDF0
p1 = 000000000062FDF4
相差4個(gè)字節(jié),也就是? 指針+1==指針內(nèi)存地址+sizeof(指針類型)
2,指針+1 值變化
#include <stdio.h>
int main(){int a[]={0,1,2,3,4,5,6};int *p=a;int *p1=p+1;printf("p = %d\n",*p);printf("p1 = %d",*p1);return 0;
} 指針:
p = 0
p1 = 1
給指針加一,表示要讓指針指向下一個(gè)變量
*p --->a[0]
*(p+1) --->a[1]
3,指針可進(jìn)行算術(shù)運(yùn)算
- 加減一個(gè)整數(shù)
- ++? ?--
- 指針相減
(1)指針相減
#include <stdio.h>
int main(){int a[]={0,1,2,3,4,5,6};int *p=a;int *p1=&a[2];printf("p = %p\n",p);printf("p1 = %p\n",p1);printf("相差 = %p",p1-p);return 0;
} 輸出:
p = 000000000062FDF0
p1 = 000000000062FDF8
相差 = 0000000000000002
?竟然不是8,而是4.說明指針相減結(jié)果不是地址差,而是 地址差/sizeof(指針類型)
4,*p++
- ?* 優(yōu)先級沒有 ++ 高
- 取出p所指的數(shù)據(jù),順便把P移到下一個(gè)位置
#include <stdio.h>
int main(){int a[]={0,1,2,3,4,5,6,-1};int *p=a;while(*p!=-1){printf("%d ",*p++);}return 0;
} 輸出:
0 1 2 3 4 5 6
?5,指針比較
- 實(shí)際上是內(nèi)存地址大小比較
- < > >= <= == !=
6,0地址
內(nèi)存有0地址,不能隨便碰
NULL <----> 0地址?
7,指針特點(diǎn)
- 不同類型指針,大小一樣
- 不同類型指針,不能相互賦值
#include <stdio.h> int main(){int a[]={0,1,2,3,4,5,6,-1};int *p=a;double *k;k=p;return 0; } [Error] cannot convert 'int*' to 'double*' in assignment
void* 指針? ?不知道指向什么的指針?
8,PTA
(1)語句int *p; *p = 50;執(zhí)行時(shí),不會(huì)有任何錯(cuò)誤。(X)
沒有先給指針P初始化,就使用指針
(2)
以下選項(xiàng)中,對基本類型相同的指針變量不能進(jìn)行運(yùn)算的運(yùn)算符是 (D)。
A.-
B.=
C.==
D.+
兩個(gè)地址相加無意義,且可能越界。
地址越界:100KB的內(nèi)存用于你的數(shù)據(jù)存儲(chǔ)或者程序運(yùn)行,但是這個(gè)時(shí)候你卻暫用了大于100KB的內(nèi)存,這樣就越界了,多出來的部分,系統(tǒng)并不知道怎么去解析或者動(dòng)態(tài)給你分配,所以出于對程序和系統(tǒng)的保護(hù),用一種和諧的方式告訴你內(nèi)存越界了或者通用內(nèi)存訪問錯(cuò)誤
(3)執(zhí)行語句int *p = 1000;后,指針變量p指向地址為1000的變量。(X)
報(bào)錯(cuò)
#include <stdio.h>
int main(){int *p=1000; return 0;
} [Error] invalid conversion from 'int' to 'int*' [-fpermissive]
總結(jié)
以上是生活随笔為你收集整理的指针运算(自己做个笔记)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 11年的雪铁龙后保险杠多少钱?
- 下一篇: 亲爱的,不在我身边,我该怎么办?