嵌入式Linux c 基礎

2021-08-04 16:56:40 字數 4404 閱讀 7650

資料型別:向計算機申請儲存資料的記憶體大小,如int 申請4位元組的大小。變數是用來儲存值的所在處,它們有名字和資料型別.變數的資料型別決定了如何將代表這些值的位儲存到計算機的記憶體中

試卷的筆記:

電腦是x86 裸機是arm

編譯程式:gcc 和 arm-linux-gcc

字串表示:反斜槓要必須雙數。查字元表。

二維陣列不能用陣列名表示陣列首位址。也不能用取址符&

char 陣列直接存放數字時候,如char a= ,則正確,而且a[0] 是在ascii 表上的 1 數字對應的字元。

double 是列印精度為六位。小數點後六位。

在迴圈中,字串讀取到「\0」時候是判斷為假。

c語言不能定義void型普通變數。

清晰理解值傳遞和位址傳遞。

值傳遞不能改變原來變數的值。傳遞指標型別的變數不等於位址傳遞。

列印行號、函式名、源檔名:__line__ , __function__ , __file__;

int 整型資料 (4位元組) 3 3 6 10 60 1000

char 字元型 (1位元組) 『a』 『c』 『1』 man ascii

oct dec hex char

100 64 40 @

short (short int)   (2位元組)        

long (long int ) (4位元組)

long long int (8位元組)

float 浮點型 (4位元組) 1.3 1.0e2;

double 雙精度浮點型 (8位元組)

無符號資料 unsigned

unsigned int

科學計數法:5e2=5*10^2

%d %x %o %u—> int 列印有符號十進位制,無符號十六進製制,無符號八進位制數。無符號十進位制

%c —> char

%hd —> short

%hhd –>列印乙個位元組大小

%ld —> long int

%lld –>long long int

%10.2e –>輸出科學計數法。保留兩位小數,輸出10位。

%hhd –>乙個位元組資料

%f ,%e —>float 小數點輸出六個零。

%lf —>double 小數點輸出六個零。

%m.nd /%m.nf –>m 輸出值占用m位輸出,n表示保留多少小數

%-m.nf —>向左對

%s             字串

%p 列印指標,列印位址

10.c語言引用標頭檔案使用的符號有兩種,以標頭檔案stdio.h為例:

(1)#include

#ifndef __head_h

#define __head_h

// 1,普通函式的宣告

void func(int size);

void f(void) // 普通函式定義不能放在標頭檔案中,否則會導致重複定義

// 2,巨集定義

#define pi 3.14

#define max(a, b) …

// 3,結構體、共用體型別定義

struct student

;// 4,列舉常量列表

enum ;

// 5,全域性變數的宣告

extern ing global;

// 6,靜態函式的定義

static int min(int a, int b)

int main(void)

int (*p);

2,如何定義乙個指標:

int (*k);

int (*k)[3];

void (*k)(int a, int b);

指標除了函式之外,對於變數和陣列都要加取位址符號&;

指標的加法是向高位址移動對應的物件。

陣列不能在賦值的左值。可以使用strcpy(str1,str2);str

2賦值給str1.

指標和陣列的不同:

指標:儲存資料位址;間接訪問資料;動態的資料結構;指向匿名資料(在堆記憶體的資料)。

陣列:儲存資料;直接訪問資料;儲存固定數目元素;自身即為資料名。

在c程式設計中,當乙個字元指標指向乙個字串常量

時,不能修改指標指向的物件的值。

char *p = 「hello world」;

*p = 『h』; // 錯誤, 不能修改常量

實驗六第二題。**

int a[4] = ;

int p1=(int )(&a+1);

int p2=(int )((int)a+1);

printf(「%d, %x\n」,p1[-1], *p2);

printf("a=%p\n",a );

printf("&a=%p\n",&a );

printf("&a+1=%p\n",&a +1);

//printf("%p\n",&(a+1) ); 錯誤

printf("a+1=%p\n",a+1 );

printf("&a[1]=%p\n",&a[1] );

printf("(非指標)(int)a+1=%#x\n",(int )a+1 );

結果:

41, f000000

a=0xbfe0a328

&a=0xbfe0a328

&a+1=0xbfe0a338

a+1=0xbfe0a32c

&a[1]=0xbfe0a32c

(非指標)(int)a+1=0xbfe0a329

1.sacaf(「%d」,&n);

2.char ch;ch=getchar(); //如果是輸入的是字串,那麼最後要加上」\n」

3.char ch[50];fgets(ch,50,stdin);

//清空輸入緩衝區:while(getchar() != 『\n』);

//清零陣列:bzero(str,0);memset(str,0,sizeof(str));

const 唯讀;const int*p; int const *p;

typedef : 為某一種資料型別,取乙個別名

main()函式分析:int main(int argc, char *argv[ ]) 或者int main(int argc, char **argv)

//int main(int argc, char *argv[ ]) // ./exmaple 123 abcd

int main(int argc, char **argv) // ./exmaple 123 abcd

{ int i;

for(i=0; i

1,語法錯誤,由gcc來檢查

2,邏輯錯誤,由你來負責

2.1 使用printf來確定出錯的位置,逐個排查錯誤

2.2 如果以上無法確定錯誤**,而且錯誤是段錯誤segmentatin fault(就是你的程式訪問了非法的記憶體,比如使用了野指標)

可以讓 gdb 幫我們直接定位出現段錯誤的地方。

a) 使用 -g 編譯待除錯**

b) 去掉系統對core檔案的大小限制: ulimit -c unlimited

c) 重新讓程式死一遍,產生乙個core檔案

d) 使用 gdb 來直接定位: gdb ./example core (注意:不是100%能解決問題,看運氣)

2.3 如果發生的不是段錯誤,或者用以上辦法,gdb無法直接定位段錯誤的位置,那就只能單步除錯

gdb 可供使用的常用命令:

list/l/l 10/l 2,30 (列出當前正在除錯的**)

breakpoint/b 20 (在第20行設定了乙個斷點)

b 20 if i>=100 (在第20行設定了乙個條件斷點)

b somefunction (在函式somefunction設定了乙個斷點)

run/r/r 123 abc (啟動程式開始執行,可以帶參)

print i/p i (檢視變數i當前的值)

display i (持續跟蹤變數 i 變化)

backtrace full/bt full (檢視當前棧記憶體的詳細細節)

whatis i (檢視變數i的型別)

next/n (單步執行:函式呼叫將會被當做一步)

step/s (單步執行:將會進入函式呼叫內部)

continue/c (繼續執行**,直到遇到下乙個斷點,或者程式退出)

quit/q (退出偵錯程式gdb)

嵌入式LinuxC基礎 排序

1.排序的穩定性 只有含有相同元素才有穩定性。相同元素的相對位置發生變化,怎不穩定。相對位置不變,則穩定。2.直接插入排序 對於給定的一組記錄,初始時假定第乙個記錄自成乙個有序的序列,其餘的記錄為無序序列 接著從第二個記錄開始,按照記錄的大小依次將當前處理的記錄插入到其之前的有序序列中,直至最後乙個...

嵌入式LinuxC基礎 指標(一)

1.指標的算術運算 指標 整數,這類表示式的結果型別也是指標。指標 只有當兩個指標都指向同乙個陣列中的元素時,才允許從乙個指標減去另乙個指標。兩個指標相減的結果的型別是有符號的整數型。2.指標的關係運算 前提是他們指向同乙個陣列中的元素。3.間接引用 對於已說明的變數來說,變數名就是變數值的直接引用...

嵌入式LinuxC基礎 檔案程式設計

1.linux檔案分類 普通檔案 計算機使用者和作業系統用於存放資料 程式等資訊的檔案。目錄檔案 linux檔案系統將檔案索引節點號和檔名同時儲存在目錄中,所以目錄檔案就是將檔名稱和它的索引節點號結合在一起的一張表。裝置檔案 linux把所有的外設都當作檔案來看待,每一種i o裝置對應乙個裝置檔案並...