指针运算(自己做个笔记)
生活随笔
收集整理的這篇文章主要介紹了
指针运算(自己做个笔记)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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個字節,也就是? 指針+1==指針內存地址+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
給指針加一,表示要讓指針指向下一個變量
*p --->a[0]
*(p+1) --->a[1]
3,指針可進行算術運算
- 加減一個整數
- ++? ?--
- 指針相減
(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.說明指針相減結果不是地址差,而是 地址差/sizeof(指針類型)
4,*p++
- ?* 優先級沒有 ++ 高
- 取出p所指的數據,順便把P移到下一個位置
#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,指針比較
- 實際上是內存地址大小比較
- < > >= <= == !=
6,0地址
內存有0地址,不能隨便碰
NULL <----> 0地址?
7,指針特點
- 不同類型指針,大小一樣
- 不同類型指針,不能相互賦值
#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;執行時,不會有任何錯誤。(X)
沒有先給指針P初始化,就使用指針
(2)
以下選項中,對基本類型相同的指針變量不能進行運算的運算符是 (D)。
A.-
B.=
C.==
D.+
兩個地址相加無意義,且可能越界。
地址越界:100KB的內存用于你的數據存儲或者程序運行,但是這個時候你卻暫用了大于100KB的內存,這樣就越界了,多出來的部分,系統并不知道怎么去解析或者動態給你分配,所以出于對程序和系統的保護,用一種和諧的方式告訴你內存越界了或者通用內存訪問錯誤
(3)執行語句int *p = 1000;后,指針變量p指向地址為1000的變量。(X)
報錯
#include <stdio.h>
int main(){int *p=1000; return 0;
} [Error] invalid conversion from 'int' to 'int*' [-fpermissive]
總結
以上是生活随笔為你收集整理的指针运算(自己做个笔记)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 11年的雪铁龙后保险杠多少钱?
- 下一篇: 字符串数组(就自己做个笔记)