C 基本概念(指標,陣列(一維二維),結構體)

2021-09-11 06:03:34 字數 4080 閱讀 6160

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 ...