#include<iostream>using namespace std;int main(){ cout << "Hello World" << endl; system("pause"); return 0;} 在控制臺中 輸出 Hello world 變數的作用: 給一段指定的記憶體空間起名, ...
#include<iostream>
using namespace std;
int main()
{
cout << "Hello World" << endl;
system("pause");
return 0;
}
在控制臺中 輸出 Hello world
變數的作用: 給一段指定的記憶體空間起名,方便反操作這段記憶體
方便我們管理記憶體空間
在記憶體中 我們有一個變數 10 , 他的記憶體編號是十六進位的
例如: 0x0000 => 10 那我們要找這個記憶體 數據量一大 就比較麻煩了 都是16進位數
所以 我們起了個a 來作為變數名(方便管理記憶體空間)
常量: 用於記錄程式中不可更改的數據
c++有兩種方式
#define 巨集常量 在文件上方定義表示一個常量
const所修飾的變數 在變數前+const 不可更改
#define day 7 //在頭文件那邊
coust int a = 10; //這個也不可修改 也會報錯
數據類型: 整型
short 短整型 占用2位元組
int 整型 4位元組
long 長整型 Windows為 4位元組 , linux為4位元組(32位操作系統),8位元組(64位操作系統)
long long 長長整型 8位元組
數據類型 浮點型
float 單精度浮點數 4位元組
double 雙精度浮點數 8位元組
如果只寫 float a = 3.14;
那這樣 這個3.14這邊是 double 類型的, 之後程式之後會進行一個轉換,會把3.14轉換成float
多了一個數據轉換的過程
//科學計數法
float f1 = 3e2;//e的後面是一個正數 代表了 3* 10的2次方 代表300
float f2 = 3e-2;//e的後面是一個負數 代表了 3* 0.1的2次方 代表0.03
數據類型 字元
char ch = 'a';
只能寫1個字元
c和c++中 字元變數只占一個位元組
字元型變數並不是把字元本身放到記憶體中存儲,而是將對應的ascll編碼放入到存儲單元
數據類型 字元串
char a[] = "123123";//c語言風格的字元串
string a = "bbb";//c++語言風格的字元串
#include<string>;//在使用c++風格的字元串的時候 要引用頭文件
數據類型: bool 布爾
bool類型占 1個位元組大小
sizeof 求出 數據類型占用記憶體大小
sizeof(數據類型/變數)
轉義字元:不能顯示出來的ASCll字元
數據的輸入 cin 關鍵字
cin>>a 將控制台輸入的 數字 賦值給a
數組:就是一個集合 裡面存放了 相同的數據類型
數組是由連續的記憶體位置組成的;
一維數組
可以統計整個數組在記憶體中的長度
可以獲取數組在記憶體中的首地址
&取地址符號
二維數組 矩陣數組
int a[4][5] ;
為4 行 5 列的 二維矩陣數組
函數的定義
返回值類型 函數名 (參數列表){
函數體
return 表達式:
}
函數必須寫在Main方法後面 要嘛就必須得聲明函數 讓編譯器知道你有這個 函數的名稱 以及如何調用函數
函數的分文件寫法:
創建.h 尾碼名的頭文件
創建.cpp尾碼名的源文件
在頭文件中寫函數的聲明
在源文件中寫函數的定義
這是在c++中寫的順序
我們在 .h 頭文件聲明的 那個方法 ,得有
#include<iostream>
using namespace std;
這兩行
之後在你的 源文件那邊 需要 引用你的 頭文件
之後在我們Main方法那邊 需要引用 頭文件
指針
可以通過指針間接訪問記憶體
記憶體編號都是從0開始記錄的 用16進位數來表示
可以利用指針變數保存地址
int a= 10 ; 記憶體中是 10這個數據, 用a來找 編號0x0001;
我用一個 p 來存儲 0x0001 這個地址 那這個 p 就是指針
用p這個指針來記錄了 a的地址
int * p = &a;
如何使用指針
通過解引用的方式來找到指針指向的記憶體
指針前 加一個 * 號 ,代表解引用,代表你找到了 p指針存儲在記憶體中的數據
*p
我們把 *p 改為1000 *p = 1000;
那記憶體中的地址中的數據也一樣發生改變 a的數據也是1000;
指針也是一種數據類型 是指針變數
指針變數占的記憶體空間是多少?
在 32位操作系統下 都是 占用4個位元組空間
在64位操作系統下 占用8個位元組空間
空指針和 野指針
空指針: 指針變數指向記憶體中編號為0的空間
用途:初始化指針變數
//空指針
// 空指針用於給指針變數進行初始化
註意:空指針指向的記憶體是不可以訪問的 ;
0~255 之間的記憶體編號是系統占用的 不允許更改,訪問
int* p = NULL; //這個就是空指針的寫法
這就是野指針,這種問題 不會被編譯器所發現 編譯會通過 但是會報錯啟動後
(讀取訪問許可權異常)
在程式中要避免出現這種野指針
int* p = (int *) 0x1100;
cout << *p << endl;
0x1100 並沒有什麼開闢記憶體 你直接指向 就會有問題
const 修飾指針
const 修飾指針 ----常量指針
const 修飾常量 ----指針常量
const 既修飾指針, 又修飾常量
const 常量指針: \
就是在指針前面加 const
const int * p =&a;
當他是常量指針的時候 指針的指向的地址 可以修改 , 但是 指針指向的值不可以修改
const int * p = &a;
*p = 20 ; //錯誤
*p = &b ; //正確
指針常量
int * const p = &a; //這就是 指針常量 在const後面的是 常量 那就是 指針常量
指針的指向 不可以改 但是 指向的值可以更改
*p = 20 ; //正確
*p = &b ; //錯誤
const 既修飾了指針 又修飾常量
const int * const p = &a;那就兩個都不可以修改
*p = 20 ; //錯誤
*p = &b ; //錯誤
指針與數組
//利用指針訪問數組中的元素
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int* p = arr;//arr 就是 數組的首地址
cout << "第一個數據-------" << *p;
for (int i = 0; i < 10; i++)
{
cout << "第" << i+1 << "個數據是=" << *p<<endl;
p++;
}
p++;//指針像後偏移四個位元組 ;
指針與函數
作用 利用指針作函數的參數 可以 修改 實參的值
其實就是 地址 傳遞 就是根據你傳入的那個地址,利用記憶體地址 來 操作 那個 數據
最後 你外部的 那個被取地址的數據 如果在內部有改變 你外部也會發生改變 ;
void GetSum(int *a, int *b,int *c)
{
*c = *a + *b;
}
void Main()
{
int a = 10 ;
int b = 20 ;
int c = 0 ;
GetSum(&a,&b,&c);
}
根據上面的方法 最後輸出的 c 就是 30 ;
結構體
結構體屬於用戶自定義的數據類型,允許用戶存儲不同的數據類型
struct 結構體名 {};
實例化結構體的 三種方法
struct Student s1;
struct Student s1={變數1,變數2,變數3}// 必須一一對應
還有一個就是在 創建結構體的時候在後面直接創建
struct 結構體名 {}s1;
在創建結構體不可以省略 struct
在調用創建的時候可以省略 struct
結構體數組
struct 結構體名 數組名[個數] = {{} , {} , {} };
結構體指針
//創建結構體變數
Student s1 = {"結構體",18,100};
//通過 指針p 取得 結構體的地址
Student* p = &s1;
//通過 -> 來獲得結構體中的屬性
p->age;
如果要獲得 指針指向的結構體的數據 那就需要 用 ->來獲得他的數據
結構體嵌套結構體
1:
Student s1 = {"",18,100};
Teacher teacher = { 1,18,"老師",s1 };
2:
Teacher t1;
t1.age = 1;
t1.id = 2;
t1.name = 3;
t1.stu.age = 18; t1.stu.name = "學生"; t1.stu.score = 100;
兩種方法都可以
在第二個方法中 必須在結構體中 創建 Student這個 結構體的時候 要加上 struct
在結構體中 const的使用場景
在 函數中 void Prist(const student * stu)
{
}
這樣就不會在函數中修改這個結構體 ,如果要修改 就不要加const
防止誤操作
將函數中的形參改為指針,可以減少記憶體空間 而且不會有多餘的副本產生
搜索
複製