c++基本概念(指標,陣列(一維二維),結構體,類和物件)
易混淆概念
計算機儲存資料時必須跟蹤的3種基本屬性
。資訊儲存在何處
儲存的值是多少
儲存資訊的型別是什麼
指標是乙個變數,其儲存的是值的位址,而不是值本身。
常見的變數,使用取位址符號(&)即可獲得變數的位址。
而 * 被稱為間接值(indirect velue)或者是解除引用運算子。將其引用於指標,即可知道該位址儲存的值。
舉例:
int update = 6;
int *p_update;
p_update = &update;
int變數update和指標變數p_update只不過是同一枚硬幣的兩面。
//指標的宣告,必須要指定指標所指向的資料型別
//原因很簡單,char和double型別使用的位元組數是不一樣的
int * pr;
其中 int * 可以看做一種型別,指向int的指標。
new將找到乙個長度正確的記憶體塊,並將返回該記憶體塊的位址。
int * pr = new int;
系統已經給指向int型別的指標pr分配了符合int長度的空間,完成初始化,程式不會報錯並發生記憶體洩漏。
int * pr = new int;
/****
****/
delete pr;
務必要記住釋放記憶體
int * psome = new int [10];
delete psome;
動態陣列,及為可以在程式執行中,需要陣列的時候建立,不需要的時候,不建立。
可以在程式執行中選擇要建立陣列的長度。這就叫動態聯編。
使用delete的時候務必要注意。
一定要注意
牢記,指標等於陣列名,不需要大括號
double * pr = new double [3];
pr[0] = 0.2;
pr[1] = 0.3;
pr[2] = 0.4;
//陣列名和指標沒有區別
陣列名為陣列第乙個元素的位址。
double wages[3] = ;
short stack[1] = ;
double * pw =wages;//注意,陣列名為陣列第乙個元素的位址,就是乙個單純的wages,不需要大括號
short *pr = &wages[0];
顯然
現在模擬輸出
pw儲存的是位址100,pw+1,因為pw是指向double型別的指標,所以pw+1儲存的位址是108.
*pw顯然是1.000,*(pw+1)是2.000,務必區別*(pw+1)和*pw+1,前者是2.000,後者是3.000
運算順序不一樣。
而pr就不一樣了,pr因為是指向short型別的指標,所以pr+1,位址加2
其餘同理。
陣列名被視為位址,int wapes[4],指標名為wapes,就是位址,可以直接int * ps = wapes;
//一維陣列
int data[4] = ;
int sum(int data,int size);
int sum(int *p,int size);//sum(data,4)可讀性一般
//二維陣列
int data[3][4] = ,,} ;
int sum(int (*arg)[4]),int size);
int sum(int data[4],int size);//可讀性比較強
在c++中,沒有提供二維陣列,在c++中建立的二維陣列,可以理解為:建立每個元素都是陣列的陣列。
比如:int maxtemps[4][5];
maxtemps包含四個元素的陣列,每個元素都是乙個由5個整數組成的陣列。
那麼在一位陣列中,我們知道,陣列名(wages的wages)代表第乙個元素的位址。
在二維陣列中,具體儲存資料的是maxtemps[x][y];
而maxtemps[x][y]的陣列名是maxtemps[x],這就代表了maxtemps[x][y]的第乙個元素的
位址是maxtemps[x]。
二維陣列,比如max[4][5],如果我只要第一行的元素,將max[0]的位址傳出即可
int * pr = max[0];
傳參的時候也是
***.h
#ifndef mainwindow_h
#define mainwindow_h
#include #includenamespace ui
class mainwindow : public qmainwindow
;#endif // mainwindow_h
***.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
mainwindow::mainwindow(qwidget *parent) :
qmainwindow(parent),
ui(new ui::mainwindow)
;//宣告結束需要冒號
關於結構體的初始化
inflatable guest =
;
具體訪問
guest.name就是檢視name的內容,其餘同理
如果我們使用typedef的話
//定義結構體
struct student
;
//於是就定義了結構體型別student
//宣告變數時直接student stu2;
//如果在c++中如果用typedef的話,又會造成區別:
struct student
stu1;//stu1是乙個變數
//使用時可以直接訪問stu1.a
typedef struct student2
stu2;//stu2是乙個結構體型別=struct student
//但是stu2則必須先 stu2 s2;宣告乙個變數
//然後 s2.a=10;
那麼既然如此,我們來看看c裡面是怎麼樣做的
//此處為c++**
struct student
;//如果要定義乙個該結構體變數,就需要:struct student st1;
//如果是c++的話,直接student st1;
//以下內容和c++一樣
typedef struct student
stu;
那麼我們定義該結構體變數的時候,就可以使用
stu st1;
st1.age;
綜上我們可以看出,typedef的作用,就是將struct student用stu這種簡單的形式代替而已。
二者在結構的沒有typedef下的情況是不一樣的,是有區別的。c++顯然更加簡單
1,使用new建立動態結構
struct things
;thing grunose = ;
things * pt = &grunose;
//顯然,grunose.good = 3,grunose.bad = 4.53;
//顯然,pt—>good = 3;pt—>bad= 4.53;
動態即意味著實在程式執行中需要設定的內容,而不是一開始靜態編譯好 指標與一維 二維陣列
示例程式 includevoid main int i,j 用陣列名做指標輸出資料 第一種方式 printf s n m 第二種方式 for i 0 m i 0 i printf c m i 注意點1 printf n 通過定義指標型變數輸出 char p m 將陣列首位址賦給指標變數p 第一種方式...
一維陣列,二維陣列與指標
陣列與指標間的三條規則 陣列名是指向陣列首元素的指標。e相當於給e公升了一階。int a 4 a 0 本身是乙個值,a 0 是乙個位址,公升階大概就是這個意思 e相當於給e降了一階。降階相當於把乙個指標降為值,a 0 是乙個位址,a 0 就成為了值 以上內容來自北京大學 c程式設計高階 一維陣列與指...
二維陣列 二維陣列和指標
include using namespace std int main 如上面這段程式所示,通過取位址符 指標 p 獲得了變數 a 的位址,那麼解引用符 就可以從 p 中得到變數 a 的值。也就是說,p a和 p a是等價的。p 是變數 a 的位址,從 p 中就可以取出 a 的值。反之,能從 p ...