文章目錄
- 內存結構
- 地址就是指針
- 為什么地址就是指針?
- 指針:地址的外號&
- 變量空間開辟于內存
- 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語言采用什么方法得到一個變量的指針 ?
方法使用取地址符 &
int a;
&a //表示a變量的第一個地址,即a變量的指針。
printf("%p\n",&a); //16進制打印
提示: 打印一個變量的指針這個數時,可以采用%d方式打印,這也說明指針是一個比較特殊的整形數,但是你又不能說它是整形數,它是一個地址,我們也可以用%p,這個是地址專用的16進制打印形式打印結果
int a;
a指的是一個變量空間,我們可以向空間讀寫數據
&a指的是一個數,是變量a的指針,或者第一個字節的地址。
如何使用一個數據
a. 使用普通的整形數
直接使用
比如 printf("%d",10);
間接使用
先把這個數放到對應類型的變量中,通過使用變量來使用這個數
正常情況下,在不涉及類型轉換時,我們要求將某個類型的數據,放到對應類型的變量中,要求類型必須保持一致
b.使用變量指針這個數
直接使用
int a=10;
printf("%d",&a);
間接使用
先把這個指針(數)放到一個變量中,然后通過這個變量使用這個數
存放指針這個數的變量就是指針變量。
int a=10;
printf("%d\n",&a);
int *p=&a;
printf("%d\n",p);
return 0;
一級指針與一級指針變量
什么是一級指針
a.指針:地址就是指針,指針是地址的別稱,指針是一個數,是一個字節的門牌號(地址)。b.變量的指針:變量空間的第一個字節地址c.什么是一級指針所有普通變量的指針就是一級指針
什么是普通變量
只要在變量的聲明或定義中,沒有*的變量就是普通變量
例如:int a;
普通變量指針的類型
指針的等級:
一級:* 類型
二級:** 類型
三級:*** 類型
一般不會超過三級
一級指針表示指針指向一個普通變量
char a='a';&a; //普通變量a的指針,表示第一個字節的地址char*類型:char型一級指針類型,*表示一級,char表示這個指針指向的變量空間是一個char型變量空間
使用指針訪問變量空間
使用指針訪問空間
&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里面存放的指針(數據)所指向的空間。
*的作用就是找到指針指向的空間。
*的兩種用途
- 定義指針變量時使用,比如
int *pa; //定義一個int型的一級指針
*表示定義的是指針變量,一個*表示一級指針變量
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;
}