從零開始學習c 之初識指標和引用

2021-08-11 02:22:28 字數 3515 閱讀 2035

指標:

指標(pointer) 是乙個值為記憶體位址的變數   記憶體位址一般使用16進製表示比如0028ff44

指標的本質只是乙個變數,指標大小為4個位元組

指標的宣告:

//第一種宣告方式

int* ptr_i1; //偏向於位址,p理解為乙個位址變數,int*是型別

//第二種宣告方式

int *ptr_i2; //偏向於值,*p理解為乙個int型變數,能表示乙個整型值

//其他兩種宣告方式

int * ptr_i3;

int*ptr_i4;

關於指標宣告方式*位置的不同:一元運算子*是間接定址或間接引用運算子,當它作用於指標時,將訪問指標所指向的物件。

int *ptr這樣宣告時便於記憶,該宣告的表示式*ptr的結果是int型別,一般使用這種宣告方式。

指標的賦值:

int i1;      //變數

i1 = 100;

ptr_i1 = &i1; //&表示獲取位址變數

*ptr_i1 = 200; //*表示取位址變數所對應的變數

cout << *ptr_i1《為指標賦值時,賦值運算子右側必須是乙個位址

指標型別:

//1.空指標

//一般指標初始化值為nullptr 必須初始化所有指標

int *ptr1 = nullptr; //等價於 int *ptr1= 0; nullptr特殊的字面量的值,可以轉化為任意指標型別

//指標也可以賦值null 等價於nullptr 但需要包含標頭檔案cstdlib

int *ptr2 = null;

cout << endl;

*指標

//void*指標存放乙個記憶體位址,位址指向的內容是什麼型別不能確定,所以用void*指標取得的變數不能修改變數值

//void*指標一般用途:用於和別的指標比較、作為函式的輸入和輸出、賦值給另乙個void*指標

double num = 3.14;

double *ptrnum1 = #

void *ptrvoid1 = #

cout << (ptrvoid1 == ptrnum1);

//*ptrvoid1 = 4.11; //無法這樣修改,因為void*指標型別不確定 報錯:表示式必須是指向完整物件型別的指標

指標與陣列:

//陣列儲存在一塊連續的記憶體空間,陣列名是這塊連續記憶體空間的首位址

double nums[5] = ;

double *ptrnum = nullptr;

ptrnum = nums; //直接指向陣列

//ptrnum = &nums[5]; //指向陣列某個元素

cout << ptrnum[3] << endl; //當指標指向某乙個陣列,指標可以視為陣列使用,因為陣列名等於陣列的首位址

cout << sizeof(ptrnum) << endl; //輸出為4 指標變數佔4個位元組

指標的遞增和遞減:

double scores[5] = ;

double *ptr_scores;

ptr_scores = scores;

for (int i = 0;i < 5;i++)

cout << endl;

ptr_scores -= 2;

cout << *ptr_scores << endl; //輸出66

引用:

//引用:為物件起了另外乙個名字

int value = 1024;

int &refvalue = value; //refvalue 指向value,是value的引用

//錯誤引用: int &refvalue2; //引用必須被初始化

//注意:引用並非物件,只是對乙個已經存在的物件起的別名

//引用只能繫結在物件上,不能指向乙個字面值或者表示式 //錯誤寫法:例如 int &refnum = 10;

//但有一種情況可以把引用指向乙個常量

const double &refcon = 10; //正確寫法 表示常量引用

//引用必須被初始化,所以使用引用前不需要測試有效性,使用引用比使用指標效率高

指標與引用的關係:

1.引用是一種進行了簡單封裝的引用

2.引用底層仍然是指標,獲取引用位址時,編譯器會進行內部轉換

3.引用的直接目的是為了讓**編寫更加流暢

指標的簡單應用:

使用指標來對乙個陣列進行逆序操作:

//逆序:首元素和尾元素交換

int arrays[8];

int *ptr_start = arrays; //乙個指標指向第乙個元素

int startcount = 0;

int *ptr_end = arrays + 7; //另乙個指標指向最後乙個元素

int endcount = 7;

int temp = 0; //臨時變數用於交換

while (ptr_start < ptr_end)

for (int i = 0;i < sizeof(arrays) / sizeof(int);i++)

指標-自由空間分配:

//使用new來請求系統系統從自由空間分配記憶體

//new 返回乙個指向分配的記憶體的指標

int *p1 = new int; //分配1個int

int *p2 = new int[5]; //分配5個int

delete p1; //釋放由new分配的記憶體

//使用new建立動態分配的陣列

int *intarray = new int[10];

//使用delete釋放記憶體

delete intarray;

delete和new的使用:

1.delete與new配對,不要使用delete釋放不是new的記憶體   

2.不能釋放已經釋放的記憶體

3.使用delete來釋放用new為陣列分配的記憶體

C語言從零開始 const初識

const是什麼 const 用於修飾變數,表示該變數是唯讀的,不可修改 在c 裡,引申了這個用 法,表示常量 include int main void const 在乙個表示式中到底修飾誰?const修飾的是誰?由下面的例子可以得到結論 const修飾變數時,遵循就近原則 include int...

C語言從零開始 memory初識

1,棧段記憶體 1,棧段記憶體 函式一旦呼叫結束,就釋放所有內部棧記憶體。宣告週期是臨時的。作用域只在花括號內 include int func void int main void 2,堆段記憶體 堆段記憶體 自己申請,自己釋放。宣告週期伴隨整個程式 沒有被釋放 作用域 建立後一直可以使用 沒有被...

C 從零開始學習

首先你需要乙個編譯器,在這裡我首先是推薦功能強大的visual studio最強ide。vs 可以嘗試自己在ide裡面敲一下,畢竟只有多動手才能成功!include 此為標頭檔案 using namespace std 告訴編譯器使用 std 命名空間。main方法為主函式,是程式開始執行的地方 i...