文章目錄
- 指標
- 記憶體
- 記憶體的地址如何產生的?
- 指標變數
- 指標變數的大小
- 結構體
- 創建結構體型別的方法
- 結構體型別創建指標變數
- 結構體中的字符陣列成員需要用strcpy() 來修改內容
指標
介紹指標前,先簡單介紹記憶體
記憶體
-
記憶體是電腦上特別重要的存盤器,計算機中所有程式的運行都是在記憶體中進行的 ,
-
所以為了有效的使用記憶體,j將記憶體劃分成一個個小的記憶體單元,每個記憶體單元的大小是1個位元組,
-
為了能夠有效的訪問到記憶體的每個單元,就給記憶體單元進行了編號,這些編號被稱為該記憶體單元的地址,
記憶體的地址如何產生的?
32位
-
有32根地址線/資料線 (電線),一旦通電就有正電和負電之分 1 0,總共產生 2^32種 二進制序列,將這些二進制序列作為記憶體單元的編號,可以有2^32個記憶體編號,
-
如果記憶體每個記憶體單元只存放1bit,那么就算記憶體在大,最大也只能支持512MB,
2^32 = 4,294,967,296(Bit) = 536,870,912(Byte) = 524,288(KB) = 512(MB)
-
所以記憶體里一個單元存放的是1Byte,可以支持的最大記憶體為4GB
2^32 = 4,294,967,296(Byte) = 4,194,304(KB) = 4,096(MB) = 4(GB)
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-AMF4BjXn-1623200638650)(C:\Users\joker\AppData\Roaming\Typora\typora-user-images\image-20210522092108400.png)]](https://img.uj5u.com/2021/06/11/243459110803541.png)
64位
就有64根地址線,記憶體編號有2^64個
指標變數
用來存放地址的變數叫做指標變數,
#include <stdio.h>
int main()
{
int a = 10;
// 1. 列印記憶體地址
printf("%p\n", &a); //%p以地址格式列印,&取地址運算子
// 64位平臺地址000000B193AFFB04 (16進制)
// 2. 將記憶體地址存入指標變數中
int* p = &a; // 變數名是p,p的型別是int*,*表示 p是真值變數
printf("%p\n", p);
// 64位平臺地址000000B193AFFB04 (16進制)
// 可以看到p里面存放的地址與&a是相同的
// 3. 解參考操作 --- *
*p = 20; // 對p進行解參考用操作,通過p里面存放的地址找到所指向的變數a,并將20賦值給a
printf("a=%d",a); // a=20;
// *p 這里其實就代表變數 a
return 0;
}

指標變數的大小
真值變數是用來存放地址的,因此:
在32位平臺上,一個指標變數所占記憶體空間的大小為4個位元組
在64位平臺上,一個指標變數所占記憶體空間的大小為8個位元組
#include <stdio.h>
int main()
{
printf("%d\n", sizeof(char *)); // 32bit-4 b4bit-8
printf("%d\n", sizeof(short *)); // 32bit-4 b4bit-8
printf("%d\n", sizeof(int *)); // 32bit-4 b4bit-8
printf("%d\n", sizeof(double *)); // 32bit-4 b4bit-8
return 0;
// 結論:指標大小在32位平臺是4個位元組,64位平臺是8個位元組,
}


結構體
結構體用來描述復雜型別,是程式員自己創造出的一種型別,
struct 結構體關鍵字
創建結構體型別的方法
// 例如創建一本書的結構體型別
struct Book
{
// 里面為結構體的成員
char name[20];
char publisher[20];
char author[20];
int price;
}; // 分號不可缺少! 用來結束型別定義
int main()
{
// 利用結構體型別-創建一個該類的變數,并初始化,
struct Book b1 = { "c primer plus","人民郵電出版社", "Stephen Prata", 60 };
// 結構體變數訪問結構體的成員時使用 . 訪問運算子
printf("書名\t= %s\n", b1.name);
printf("出版社\t= %s\n", b1.publisher);
printf("作者\t= %s\n", b1.author);
printf("價格\t= %d元\n", b1.price);
// 里面的屬性值可以修改
b1.price = 30;
printf("價格\t= %d元\n", b1.price);
return 0;
}

結構體型別創建指標變數
. 訪問運算子應用于結構體變數,
結構體變數名.成員
-> 訪問運算子應用于結構體指標,
結構體指標名->成員
struct Book
{
char name[20];
char publisher[20];
char author[20];
int price;
};
int main()
{
struct Book b1 = { "c primer plus","人民郵電出版社", "Stephen Prata", 60 };
// b1 的型別為struct Book,因此用struct Book 來創建指標變數
struct Book* pb1 = &b1;
// 列印b1的地址
printf("%p\n", pb1);
// 使用解參考運算子時 *pb1 等價于 b1 都是結構體變數,使用 . 來訪問
// (*pb1)需要加括號
(*pb1).price = 50;
printf("(*pb1) = %d\n", b1.price); // 修改的依然是b1.price
// 結構體指標訪問結構體時 使用 -> 訪問運算子
pb1->price = 30;
printf("pb1 = %d\n", b1.price);
return 0;
}

結構體中的字符陣列成員需要用strcpy() 來修改內容
- strcpy()是一個庫函式 需要參考string.h
- strcpy(destination,存放的內容);
#include <string.h>
#include <stdio.h>
struct Book
{
char name[20];
char publisher[20];
char author[20];
int price;
};
int main()
{
struct Book b1 = { "c primer plus","人民郵電出版社", "Stephen Prata", 60 };
// strcpy -- string copy 字串拷貝
// b1.name 是一個陣列,本質上存放的一個地址
strcpy(b1.name, "C語言程式設計");
printf("%s\n", b1.name);
return 0;
}
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-EFjcnI1G-1623200638659)(C:\Users\joker\AppData\Roaming\Typora\typora-user-images\image-20210608160447634.png)]](https://img.uj5u.com/2021/06/11/243459110803547.png)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/286593.html
標籤:其他
上一篇:大學到職場 | 計算機專業出生!學姐做了軟體測驗,大廠也不是遙不可及...
下一篇:C語言入門必看!(二)
