1. 程式人生 > >C語言單元小結(5)

C語言單元小結(5)

二維陣列

int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};
陣列名是陣列第一個元素的首地址,也就是arr == &arr[0]
arr[0]是第二維的陣列名,也就是arr[0] == &arr[0][0]
arr[0][0]是元素

//一重指標和二維陣列匹配
int *p = arr[0];
p++;

//指標陣列、陣列指標和二位陣列匹配
int *p[2] = {arr[0], arr[1]}; // == p[0] == arr[0]
int (*p1)[3] = arr; // ((p1+i)+j)

二級指標

void func(int **p)
{

}

//定義指標
int a = 23, b = 33;
int **p, *p1;

//繫結
p1 = &a;
p = &p1;

//呼叫函式
func(p);

非法地址訪問

int *a
a=(int *)0x123 //(int *)把數值0x123強制轉化為地址
*a=xxx
不能這樣使用非法地址

結構體struct

知識點

struct infor        // struct infor 是識別符號,必須整體使用
{
    char name[50];  // (元素)成員變數(屬性)
    char is_male;
    int
age; }; // 分號堅決不能少 struct //struct data { int a; float b; char c; }s; // 這個S是變數名的意思;定義型別的同時給出了結構體的變數名 typedef struct str5 { int a; char b; }ST, *p_ST; // ST是struct str5的型別名,p_ST是struct str5 *型別的別名 ST a;//結構體型別的變數 p_ST p;//指向結構體變數的指標

定義一個型別,不佔空間,宣告該型別的變數時才分配空間。
typedef struct infor S; //重定義型別名

初始化

完全初始化
S s1={“name”,’0’,3};

部分初始化
S s2={“name”};
S s3={.age=3};
運算子(.)是專用於結構體變數訪問個元素

注意:
S s3 = {1, 2, 3};//錯誤:由於第一個成員是字串型別,所以系統會讀取資料到遇到’\0’賦值給.name成員

結構體指標

struct st *p;//野指標
struct st s;
p = &s;

結構體陣列

void set_value_func(struct st arr[], int lenth)
{
    int i = 0;

    for (i=0; i<lenth; i++)
    {
        scanf("%d %f %d", &arr[i].a,&arr[i].b,&arr[i].c);
    }
}

void show_infor_func(struct st arr[], int lenth)
{
    int i = 0;
    for (i=0; i<lenth; i++)
    {
        printf("%d %.2f %d\n", arr[i].a, arr[i].b, arr[i].c);
    }
}

struct st arr[3];

set_value_func(arr, 3);
show_infor_func(arr, 3);

結構體裡.號的實質

&s型別是struct st *

方法一
int *p_a = (int *)&s;
printf(“*p_a = %d.\n”, *p_a);
float *p_b = (float *)((char *)&s+4); // 4位元組

方法二
// 分析:地址值轉化為數字
float *p_b = (float *)((long)&s+4); // overlap
printf(“*p_b = %.2f.\n”, *p_b);
char *p_c = (char *)((char *)&s+8);
printf(“*p_c = %d.\n”, *p_c);

相同結構體變數之間可以互相賦值

srtuct
{
    int a;
    char b;
}s1,s;

s1.a=1;
s1.b='a';

s1 = s;

位元組對齊

1、 結構體變數的地址是從4位元組對齊的未知開始(0、4、8、C)
2、各成員在結構體裡自身要對齊;
3、成員之間不滿足自身對齊,得填充(padding)
4、滿足結構體自身對齊的最小倍數
5、預設是4位元組對齊,最大的基本資料型別和這個預設值要相比較,取其小

struct str1      // 7
{
    int a;       // 4
    char b;      // 1 + 1
    short c;     // 2
}s1; // 8

struct str2
{
    char a;     // 1
    char b;     // 1
            // + 2  
    int c;      // 4
}s2; // 8

struct str3         // 6
{
    int a;
    char b;
    char c;
            // + 2
}s3;  // 8
struct str4
{
    char a;
    short b;
    short c;
}s4;    //6

相關推薦

C語言單元小結(5)

二維陣列 int arr[2][3] = {{1, 2, 3}, {4, 5, 6}}; 陣列名是陣列第一個元素的首地址,也就是arr == &arr[0] arr[0]是第二維的陣列名,也就是arr[0] == &arr[0][0] a

C語言單元小結(2)

巨集 知識點 功能:巨集可在預編譯時將程式中某些內容直接替換,沒有優先順序 帶參巨集: 帶參巨集與普通函式的比較: 1.帶參巨集不必指定引數型別,而函式只能傳遞某個型別的引數。 2.帶參巨集在預編譯時直接替換,比函式呼叫更有效率,開銷更小。 3.帶

C語言單元小結(6)

結構體 1.位元組對齊 知識點: 對齊規則:1、我們的結構體變數在4位元組對齊的位置。 2、第一個成員,從結構體開始的地址處存放。具體佔多少位元組,由緊挨著下個元素決定。 3、整個結構體是預設位元組對齊的最小整數倍。 //結構體預設的位元組對

C語言高階篇 - 5.記憶體

1、馮諾依曼結構和哈佛結構      (1)馮諾依曼結構是:資料和程式碼放在一起。      (2)哈佛結構是:資料和程式碼分開存在。      (3)什麼是程式碼:函式   &nbs

C語言教程(5)之指標

指標:(C語言的靈魂) 記憶體的儲存是以一個位元組為一個編號,也就是8位合在一起給一個編號,不是0,1就給編號。 記憶體分為很多個單元,每個單元就會分配一個編號。 地址:記憶體單元的一個編號。而指標和地址一個概念的。也就是說指標就是地址。 普通變數:只能存放一個值

手把手教你構建 C 語言編譯器(5

本章中我們用 EBNF 來大致描述我們實現的 C 語言的文法,並實現其中解析變數定義部分。 由於語法分析本身比較複雜,所以我們將它拆分成 3 個部分進行講解,分別是:變數定義、函式定義、表示式。 手把手教你構建 C 語言編譯器系列共有10個部分: EBNF 表示 EBNF 是對前一章提到的 BNF 的擴充

C語言再學習5-陣列與優化

什麼是陣列?為什麼要用陣列? 通俗來講,在記憶體中一塊連續儲存資料的叫陣列,陣列的每個子元素的寬度都一樣,並且只能為通用的資料型別做單位(char,short,int等等) 讓我們先定義一個數組,然後賦值: char arr1[2] = { 0 }; arr1

中國大學MOOC課程《程式設計入門——C語言》 第5周程式設計練習

1 素數和(5分) 題目內容: 我們認為2是第一個素數,3是第二個素數,5是第三個素數,依次類推。 現在,給定兩個整數n和m,0<n<=m<=200,你的程式要計算第n個素數到第m個素數之間所有的素數的和,包括第n個素數和第m個素數。 輸入格式:

C語言單元

Hello world! 小白一隻來到程式設計的世界 第二章 C資料型別小結 ————基礎知識 一、常量(整型、實型、字元型、字元型) ——整型知識 1、通常為十進位制數,八進位制由數字0開頭,十六進位制由0x開頭。 2、型別:有符號(預設),無符號(後跟U、u

Check—強大的C語言單元測試框架

repr free fail turn ram creat log cap less 1. 前言 在看基數樹源碼時,發現源碼裏面有個deps的依賴文件夾,deps裏是一個叫Check的源碼安裝包,Google之後發現Check原來是C語言單元測試框架。關於單元測試,Wik

手把手教你做一個 C 語言編譯器(5):變數定義

本章中我們用 EBNF 來大致描述我們實現的 C 語言的文法,並實現其中解析變數定義部分。 由於語法分析本身比較複雜,所以我們將它拆分成 3 個部分進行講解,分別是:變數定義、函式定義、表示式。 本系列: EBNF 表示 EBNF 是對前一章提到的 BNF 的擴充

CUnit使用入門-精簡的C語言單元測試工具

目的:通過一個示例演示,掌握用Cunit做單元測試 內容: 1、介紹Cunit架構 2、介紹Cunit的測試模式 3、例項演示用Cunit 寫單元測試的操作流程 1.Cunit架構 Test Registry |

C語言單元測試框架-Check

     雖然在UNIX上用C語言做開發已經有一段時間了,但是我不得不承認,自己單元測試做的並不好。恰好最近有新的開發任務,就學習了一些關於測試驅動開發的知識,準備改進自己的單元測試。XP程式設計已經興起好一段時間了,也形成了很多優秀的單元測試框架,例如:JUnit,想必使用

C語言單元測試框架Check

什麼是Check Check是C語言的一個單元測試框架。它提供一個小巧的單元測試介面。測試案例執行在各自獨立的地址空間,所以斷言失敗和程式碼錯誤造成的段錯誤或者其他的訊號可以被捕捉到。另外,測試的結果顯示也相容以下這些格式:Subunit、TAP、XML和通用

C語言單元測試框架unit的使用

針對C語言的測試框架相比其他語言要少一些,本文簡單介紹一下Cunit框架的基本使用方法,權當備忘吧。Cunit的組織框架如下圖所示: 將單個測試用例打包到一個suite中,這些suite在Registry中註冊。registry中的所有suite/tests可以使用單個函式呼叫執行,也

C語言入門教程-(5)格式化輸入輸出

1.輸入和輸出 在程式的使用中,我們經常可以看的這麼一個場景:使用者需要輸入資料,經過程式運算,得到結果後輸出。在C語言中,輸入資料和輸出資料都是由庫函式完成的,通過語句來輸入/輸出。 2.格式化輸出—printf()函式 C語言程式運算的結果在記憶體中,我們需要將其輸出到指定裝置中,我們才

C語言,判斷一個5位數是不是迴文數。即12321是迴文數,個位與萬位相同,十位與千位相同。

<span style="font-size:18px;color:#330033;">int a = 0; printf("輸入一個五位數:"); scanf("%d",

關於嵌入式C語言單元測試自動化框架的搭建思路

  嵌入式C語言單元測試框架設計Demo(基於Keil專案)    Driver    TestSuite - TestCase    Assert    TestLog    板上執行測試用例   

編譯C語言單元測試框架CUnit庫的方法

個人備忘使用 /*********************************************************************  * Author  : Samson  * Date    : 06/04/2015  * Test platform:  *        

Linux-C基礎知識學習:C語言作業-將5個學生成績儲存在一個數組中,單獨實現一個計算平均成績的average函式, 在main函式中獲取該函式返回的平均值,並列印。

Linux基礎知識學習 C語言作業:將5個學生成績儲存在一個數組中,單獨實現一個計算平均成績的average函式, 在main函式中獲取該函式返回的平均值,並列印。 #include <s