C/C++ 指针的深入理解
文章目錄
- 內存結構
- 地址就是指針
- 為什么地址就是指針?
- 指針:地址的外號&
- 變量空間開辟于內存
- 1.所開辟的空間字節數>=1字節
- 2.變量的每個字節都一個地址
- 3.變量的第一個字節的地址代表整個變量的地址
- 4.如何使用變量的指針找到整個變量空間?
- 變量指針就是一個數
- 如何使用一個數據
- 一級指針與一級指針變量
- 什么是一級指針
- 什么是普通變量
- 普通變量指針的類型
- 使用指針訪問變量空間
- 使用指針訪問空間
- 如何找到a變量地址,然后讀、寫a變量地址
- 使用指針操作a變量空間
- *的兩種用途
- 指針的好處
- 傳遞指針
- 傳遞普通數值與傳遞指針的異同
- 指針的含義
- 連續內存
- 內存單一
內存結構
內存是由字節組成的
每個字節都有一個地址
地址就是指針
地址的別稱就是指針
為什么地址就是指針?
因為地址有指向作用,通過這個地址可以找到某個字節空間,然后操作(讀、寫)字節空間,因為地址有指向作用,因此我們也稱地址為指針。
舉個例子:
稱門牌號為指針,因為門牌號指向了某個房間,當然我們可以稱自己家的地址為指針,因為我家的地址指向了我家,根據門牌號和地址的指向,可以找到某個房間和我家,帶有指向作用的是指針。
指針:地址的外號&
變量空間開辟于內存
1.所開辟的空間字節數>=1字節
比如
char型變量 1個字節 short型變量 2個字節 int型變量 4個字節 float型變量 4個字節 double型變量 4個字節sizeof是運算符不是函數
2.變量的每個字節都一個地址
3.變量的第一個字節的地址代表整個變量的地址
即變量的指針就是變量第一個字節的地址
使用變量的地址(第一個字節的地址),找到相應的變量空間,進行操作,讀或寫變量空間
4.如何使用變量的指針找到整個變量空間?
a.通過變量指針找到變量的第一個字節
b.根據變量的類型得到變量所占的總的字節,從第一個字節往后數,找到變量空間所有字節
變量指針就是一個數
a. 指針這個數好比門牌號
指針就是一個數,只是這個數有點特殊,它是一個地址
門牌號是房間的地址,用來指向某個房間。
b. C語言采用什么方法得到一個變量的指針 ?
方法使用取地址符 &
提示: 打印一個變量的指針這個數時,可以采用%d方式打印,這也說明指針是一個比較特殊的整形數,但是你又不能說它是整形數,它是一個地址,我們也可以用%p,這個是地址專用的16進制打印形式打印結果
int a;
a指的是一個變量空間,我們可以向空間讀寫數據
&a指的是一個數,是變量a的指針,或者第一個字節的地址。
如何使用一個數據
a. 使用普通的整形數
直接使用
比如 printf("%d",10);
間接使用
先把這個數放到對應類型的變量中,通過使用變量來使用這個數
正常情況下,在不涉及類型轉換時,我們要求將某個類型的數據,放到對應類型的變量中,要求類型必須保持一致
b.使用變量指針這個數
直接使用
間接使用
先把這個指針(數)放到一個變量中,然后通過這個變量使用這個數
存放指針這個數的變量就是指針變量。
一級指針與一級指針變量
什么是一級指針
a.指針:地址就是指針,指針是地址的別稱,指針是一個數,是一個字節的門牌號(地址)。b.變量的指針:變量空間的第一個字節地址c.什么是一級指針所有普通變量的指針就是一級指針什么是普通變量
只要在變量的聲明或定義中,沒有*的變量就是普通變量
例如:int a;
普通變量指針的類型
指針的等級:
一級:* 類型 二級:** 類型 三級:*** 類型一般不會超過三級
一級指針表示指針指向一個普通變量
使用指針訪問變量空間
使用指針訪問空間
&a //一個數,表示a變量的第一個地址,即a變量的指針(門牌號) int *pa;//表示定義一個整型的一級指針變量,用于存放整形一級指針(數) int *pa=&a;如何找到a變量地址,然后讀、寫a變量地址
1.直接通過變量名進行操作
寫數據:a=100;
讀數據:int b; b=a;
使用指針操作a變量空間
寫數據
*pa=200; //等價于a=100讀數據
int b=*pa; //等價于int b=a; 此時,*pa代表的就是a變量空間,我們可以對其讀寫 這里的*找空間操作:找到指針變量pa里面存放的指針(數據)所指向的空間。*的作用就是找到指針指向的空間。
*的兩種用途
2.訪問空間時使用*
int a; int *pa=&a; *pa=100;//*找空間操作,找到pa這個指針變量里面放的指針所指向空間,*pa代表指針指向空間指針的好處
int a=10; int *pa=&a; //pa里面放的是a的門牌號a=100; //使用變量名a訪問變量空間,寫空間,把100寫入 int b=a;//使用變量名a訪問變量空間,讀空間,將空間里面存放的數讀出,賦值(寫)給b*pa=200; //等價于a=200,*pa代表的就是a空間,然后對其進行寫操作 b=*pa; //等價于b=a,*pa代表的就是a空間,然后從a空間讀數據,寫入b變量傳遞指針
#include<stdio.h>void fun(int *pa,float *pb) {*pa=200;*pb=300.60;} int main() {int a=10;float b=0.56;fun(&a,&b);printf("in main a=%d\n",a);printf("in main b=%f",b);return 0; }等價于
#include<stdio.h> #include<string.h>void fun(int *pa,float *pb) {*pa=200;*pb=300.60;}int main() {int a=10;float b=0.56; // fun(&a,&b);int *pa=&a;float *pb=&b;fun(pa,pb);printf("in main a=%d\n",a);printf("in main b=%f",b);return 0; }傳遞普通數值與傳遞指針的異同
(1)相同點
都是將實參的數賦值給形參變量。
(2)區別
前者傳遞的是一個普通的數,后者傳遞的是門牌號,即地址(指針),可以通過地址操作它指向的變量空間。
指針的含義
a.指針是一個數
指針是一個地址,變量的指針指的都是變量第一個字節的地址。
地址(指針)具備指向作用
b.指針變量
指針變量是一個變量,用來存放指針(地址),指針變量不具有指向作用,指針變量只是用來存放地址。指針變量因為存放地址才有了指向作用,指針變量存放的指針具有指針作用
指針和指針變量是兩個不同的概念,只是約定俗成,習慣統一稱為指針。
提示:
當一個指針變量里面存放指針這個數后,即這個指針變量指向了某個空間,但是你自己應該非常清楚,本質并不是指針變量指向某個空間,而是這個指針變量內存放的指針指向某個空間。
連續內存
//連續的動態分配 #include<stdio.h> #include<stdlib.h> int main(){ // int *p=(int *)malloc (5*sizeof(int)); // *(p+3)=3; // printf("%d",*(p+3));int number;printf("input student number:");scanf("%d",&number);int *p=(int *)malloc (sizeof(int)*number);for(int i=0;i<number;i++){printf("input %d someone's grade:",i+1); // scanf("%d",&p[i]);scanf("%d",p+i);} //輸出for(int i=0;i<number;i++){printf("%d\t",p[i]);//*(stu+i) } printf("\n");return 0; }內存單一
//單一元素 #include<stdio.h> #include<stdlib.h> int main(){int *p=(int *)malloc(sizeof(int));*p=3;printf("%d",*p);return 0; }總結
以上是生活随笔為你收集整理的C/C++ 指针的深入理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows下设置自动关机的命令指示符
- 下一篇: 赣州理工大学周边小区房租多少钱?