《C和指針》讀書筆記


看過了經典的K&R C,又看了這本Pointers on C,溫習了C語言的基本語法。

在重溫過程中,感覺需要重點把握的知識是指針、結構和動態內存分配

這對今后的算法和操作系統方面的研究學習很有幫助。


3.2.3 聲明指針

int* b, c, d;

本以為這條語句把三個變量聲明為整型的指針,但事實并非如此。
星號*只對b有用,其余兩個變量只是普通的整型。正確語句:int *b, *c, *d;


3.3 typedef

允許為各種數據類型定義新名字。
#define無法正確地處理指針類型,如下:
#define d_ptr_to_char char *
d_ptr_to_char a, b;
只正確地聲明了a,但是b卻被聲明為一個字符。


3.4 常量

int const *pci; ? ? // 一個指向整型常量的指針
int * const cpi; ? ?// 一個指向整型的常量指針


5.4.4 優先級和求值的順序

兩個相鄰操作符的執行順序由它們的優先級決定。
如果它們的優先級相同,它們的執行順序由它們的結合性決定。
除此之外,編譯器可以自由決定使用任何順序對表達式進行求值。


5.8 問題

2.下面程序的結果是什么?

int func(void)
{
static int counter = 1;
return ++counter;
}

int main()
{
int answer;
answer = func() - func() * func();
printf("$d\n", answer);
}


6.13 指針運算

當一個指針和一個整數執行算術運算時,整數在執行加法運算前始終會根據合適的大小進行調整。
即把整數量乘以指針所指向類型的大小。

指針 +/- 整數

指針 - 指針
只有當兩個指針都指向同一個數組中的元素時,才允許從一個指針減去另一個指針。

< <= > >=
可以在兩個任意的指針間執行相等或不等測試。


7.2 函數聲明

如果沒有關于調用函數的特定信息,編譯器便假定在這個函數的調用時參數的類型和數量是正確的。它同時會假定函數將返回一個整型值。如果編譯器認定函數返回一個整型值,它將產生整數指令操縱這個值。
float f;
f = xyz();
xyz的返回值會被假定為整型,當成整型返回然后轉換成浮點型。


7.5 遞歸

許多教科書都把計算階乘和斐波那契數列用來說明遞歸,這是非常不幸的。在第1個例子里,遞歸并沒有提供任何優越之處。在第2個例子中,它的效率之低是非常恐怖。


8.1 一維數組

對于int類型的數組,數組名的類型就是“指向int的常量指針”。
int a[10];
int *c;
a = c; ? ? // error

int ap[10];

ap:指針變量中的值,即數組的起始地址。
*ap:ap[0]
ap[0]
ap + 6:數組地址加6,即第6個元素的地址。
*ap + 6:ap[0]+6
*(ap + 6):ap[6]


9.2 字符串長度

size_t strlen(char const *string);

注意strlen返回一個類型為size_t(無符號整型)的值。在表達式中使用無符號數可能導致不可預料的結果。
if ( strlen(x) >= strlen(y) ) ...
if ( strlen(x) - strlen(y) >= 0) ...
第1條語句能按照你預想的那樣工作,第2條語句的結果將永遠為真。>=左邊的表達式將是無符號數,而
無符號數絕不可能是負的。
類似的:
if ( strlen(x) >= 10) ...
if ( strlen(x) - 10 >= 0) ...
原因同上。


9.3 不受限制的字符串函數

復制:char *strcpy(char *dst, char const *src);
拼接:char *strcat(char *dst, char const *src);
比較:int strcmp(char const *s1, char const *s2);
注意常見錯誤:if(strcmp(a, b))。以為如果兩個字符串相等,它的結果將是真。恰恰相反。


9.5 字符串查找基礎

查找一個字符
char *strchr(char const *str, int ch);
char *strrchr(char const *str, int ch);

char string[20] = "Hello there, honey."
char *ans;
ans = strchr(string, 'h'); ? ? // ans=string+7

查找任何幾個字符
char *strpbrk(char const *str, char const *group);

ans = strpbrk(string, "aeiou"); ? ? // ans=string+1

查找一個子串
char *strstr(char const *s1, char const *s2);
這個函數在s1中查找整個s2第1次出現的起始位置,并返回一個指向該位置的指針。


9.9 內存操作

void *memcpy(void *dst, void const *src, size_t length);
和strn開頭的函數不同,它們在遇到NUL字節時并不會停止操作。

char temp[SIZE], values[SIZE];
memcpy(temp, values, SIZE); ? ? // 復制char數組

int temp[SIZE], values[SIZE];
memcpy(temp, values, sizeof(values)); ? ? // 復制int數組要考慮移植性

int temp[5], values[SIZE];
memcpy(temp, values, 5 * sizeof(values[0])); ? ? // 復制int數組的前5個元素


10.1 結構基礎知識

struct SIMPLE {
int ? ? ? ? a;
char ?????b;
float ?????c;
};
struct SIMPLE x;
struct SIMPLE y[20], *z;

也可以將結構創建成一種新的類型。

typedef struct {
int ?????a;
char ? ?b;
float ? ?c;
} Simple;
Simple x;
Simple y[20], *z;


結構的自引用
struct SELF_REF2 {
int ? ? a;
struct SELF_REF2 *b;
int ? ? c;
} A;

如果聲明struct SELF_REF2 b;則此結構定義是非法的。因為編譯器在結構的長度確定之前就已經知道指針的長度,所以聲明成指針才是合法的。

訪問方式:*(A.b).a 或 A->b.a


10.3 結構的存儲分配

struct ALIGN {
char a;
int ? ?b;
char c;
};

編譯器按照成員列表的順序一個接一個地給每個成員分配內存,可以在聲明中對結構的成員列表重新排列。

struct ALIGN2 {
int ? ?b;
char a;
char c;
};


10.4 作為函數參數的結構

void f(struct ALIGN a); ? ? // 調用函數時要拷貝整個結構到棧中
void f(struct ALIGN *a); ? ?// 只傳遞4字節的指針


10.5 位段

struct CHAR {
unsigned ch : 7;
unsigned font : 6;
unsigned size : 19;
} ch1;

size位段過大無法容納于一個短整型,但其余位段都比一個字符還短。
位段使程序員能夠利用存儲ch和font所剩余的位來增加size的位數,避免聲明
一個32位的正數來存儲size位段。

訪問磁盤控制器的例子,假設其地址為0xc0200142。

struct DISK_REGISTER_FORMAT {
unsigned ? ? command ? ? : 5;
unsigned ? ? sector ? ? ? ? ?: 5;
unsigned ? ? track ? ? ? ? ? ?: 9;
...
unsigned ? ? ready ? ? ? ? ? : 1;
};

#define DISK_REGISTER ((struct DISK_REGISTER_FORMAT *) 0xc0200142)

// 告訴控制器從哪個扇區哪個磁道開始讀取
DISK_REGISTER->sector = new_sector;
DISK_REGISTER->track ? = new_track;
DISK_REGISTER->command = READ;

while ( !DISK_REGISTER->ready)
;


10.6 聯合

union {
float ? ? f;
int ? ? ? ?i;
} fi;

fi.f = 3.14159;
printf("%d\n", fi.i);

首先把π的浮點表示形式存儲于fi,然后把這些相同的位當做一個整型值打印輸出。


11.1 - 3

malloc:
void *malloc(size_t size);
void free(void *pointer);
這些函數維護一個可用內存池。當一個程序另外需要一些內存時,malloc從
內存池中提取一塊合適的內存。

calloc:
void *calloc(size_t num_elements, size_t element_size);
calloc在返回指向內存的指針之前把它初始化為0。

realloc:
void realloc(void *ptr, size_t new_size);
如果原先的內存塊無法改變大小,realloc將分配另一塊正確大小的內存,
并把原先那塊內存的內容復制到新的塊上。


11.5 常見的內存錯誤

1. 忘記檢查所請求的內存是否成功分配。

int *pi;
pi = malloc(100);
if (pi == NULL) {
printf("Out of memory!\n");
exit(1);
}

2. 操作內存時超出了分配內存的邊界。

3. 傳給free函數一個指針,讓它釋放一塊并非動態分配的內存。
試圖釋放一塊動態分配內存的一部分也有可能出錯。

pi = malloc(10 * sizeof(int));
free(pi + 5);

4. 內存泄露



轉載于:https://www.cnblogs.com/xiaomaohai/archive/2012/02/04/6157871.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/275040.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/275040.shtml
英文地址,請注明出處:http://en.pswp.cn/news/275040.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

FPGA設計者的5項基本功

記得《佟林傳》里&#xff0c;佟林練的基本功是“繞大樹、解皮繩”&#xff0c;然后才練成了什么“鬼影隨行、柳葉綿絲掌”。 在我看來&#xff0c;成為一名說得過去的FPGA設計者&#xff0c;需要練好5項基本功&#xff1a;仿真、綜合、時序分析、調試、驗證。 需要強調的一點是…

unity 全息交互ui_UI向3D投影全息界面的連續發展

unity 全息交互uiThe user interface has been natural in its evolution and strategically heading towards the 3D-projection holographic interface (3D-PHI) era.用戶界面在其發展過程中一直很自然&#xff0c;并且在戰略上正朝著3D投影全息界面( 3D-PHI )時代邁進。 Si…

開發工具 快捷鍵整理

快捷鍵大全 JAVA 開發工具 MyEclipse -------------------------------------MyEclipse 快捷鍵1(CTRL)-------------------------------------Ctrl1 快速修復CtrlD: 刪除當前行 CtrlQ 定位到最后編輯的地方 CtrlL 定位在某行 CtrlO 快速顯示 OutLine CtrlT 快速顯示當前類…

前端構建新世代,Esbuild 原來還能這么玩!

大家好&#xff0c;我是若川。持續組織了5個月源碼共讀活動&#xff0c;感興趣的可以點此加我微信 ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。今天分享一篇esbui…

大三下學期十四周總結

在小組的學習方面&#xff0c;這周主要是對微信小程序的學習。對JSON格式請求在Spring boot與小程序之間的交互有了一些了解。對微信的接口wx.request、wx.uploadFile、wx.chooseImage的接口的使用。微信開發后臺傳過來的響應數據如果不是標準的json格式&#xff0c;需要在小程…

平面設計師和ui設計師_平面設計師為什么要享受所有樂趣?

平面設計師和ui設計師Graphic designers are pretty cool. We have to admit that. Be it their dressing style, their attitude and most importantly their enviable gadgets. Large Mac monitor, wacom tablet, drawing sets, swatchbooks , iPad pro with pencil, humungo…

轉:Xcode下的GDB調試命令

Xcode的調試器為用戶提供了一個GDB的圖形化界面&#xff0c;GDB是GNU組織的開放源代碼調試器。您可以在Xcode的圖形界面里做任何事情&#xff1b;但是&#xff0c;如果您需要您可以在命令行里使用GDB的命令&#xff0c;且gdb可以在終端運行&#xff0c;也可以在Xcode下的控制臺…

web表單設計:點石成金_設計復雜的用戶表單:12個UX最佳實踐

web表單設計:點石成金It’s been a few years that I’ve been taking interest in designing complex user forms, where a lot of information is requested from users. Here are a few industries where you regularly find such flows:幾年來&#xff0c;我一直對設計復雜…

跨平臺開發框架到底哪家強?5款主流框架橫向對比!

跨平臺開發框架到底哪家強&#xff1f;目前市場上有多個專業做跨平臺開發的框架&#xff0c;那么對開發者來說究竟哪一個框架更符合自己的需求呢&#xff1f;筆者特地總結對比了一下不同框架的特性。國內外筆者選擇了一共5個主流的測評對象&#xff0c;分別是RN&#xff0c;Flu…

【一句日歷】2019年6月

【2019年6月1日兒童節星期六】 人們在協商&#xff0c;解決和處理各種狀況時&#xff0c;若要獲得圓滿的結果&#xff0c;平靜的心和自我控制能力必不可少。任何人都明白。如果我們不能很好地控制自我&#xff0c;反而讓焦躁和嗔怒干擾了我們&#xff0c;那么我們的工作不再具有…

Android學習摘要一之Android歷史

Google與你998年9月7日創立&#xff0c;經過十幾年在搜索引擎方面的精耕細作&#xff0c;成為全球互聯網巨頭&#xff0c;尤其在地圖搜索的應用更是引人注目。Google與2007年11月5日宣布基于Linux平臺的開源手機操作系統&#xff0c;名稱為Android&#xff0c;中文譯為“機器人…

c#創建web應用程序_創建Web應用程序圖標集的6個步驟

c#創建web應用程序I am not great at creating logos or icons, mainly because of the lack of practice. So when I was tasked to create an unique icon set for our web app, I wasn’t confident that things will turn out right. After researching effective and rele…

基于pnpm + lerna + typescript的最佳項目實踐 - 理論篇

本文來自作者金虹橋程序員 投稿原文鏈接&#xff1a;https://juejin.cn/post/7043998041786810398本系列文章分為兩篇&#xff1a;理論篇和實踐篇 理論篇&#xff1a;介紹pnpm&#xff08;pnpm的特點、解決的問題等&#xff09;、lerna&#xff08;lerna的常用命令&#xff09;…

nginx 多進程 + io多路復用 實現高并發

一、nginx 高并發原理 簡單介紹&#xff1a;nginx 采用的是多進程&#xff08;單線程&#xff09; io多路復用(epoll)模型 實現高并發 二、nginx 多進程 啟動nginx解析初始化配置文件后會 創建&#xff08;fork&#xff09;一個master進程 之后 這個進程會退出 master 進程會…

轉載:程序員從初級到中級10個秘訣

Justin James曾發表過一篇博文《10 tips for advancing from a beginner to an intermediate developer》&#xff0c;為我們分享如何才能完成程序員從初級到中級的蛻變&#xff0c;現將中文譯文轉載于此&#xff0c;供大家借鑒。 在一封與TechRepublic會員交流的郵件當中&…

ux設計工具_UX設計中的工具和實用主義

ux設計工具There’s a zillion tools for User Experience and User Interface Design. Don’t take my word for it: a simple Google search for “what are the best tools for wireframing” (to take just one aspect of UX) leads you to endless pages of “The 20 best…

幕后常駐嘉賓配音小姐姐的2021年度總結

大家好&#xff0c;我是若川。這是公眾號幕后常駐嘉賓配音小姐姐&#xff0c;看完了上一個阿源小姐姐的年度總結《一張圖看程序媛阿源的2021個人年度流水賬》&#xff0c;寫的年度總結投稿。點擊以下音頻可以查看收聽往期更多音頻。以下是正文~Hi&#xff0c;大家好呀~我是若川…

java spring cloud版b2b2c社交電商spring cloud分布式微服務:服務注冊與發現(Eureka、Consul)...

Spring Cloud簡介電子商務社交平臺源碼請加企鵝求求&#xff1a;一零三八七七四六二六。Spring Cloud是一個基于Spring Boot實現的云應用開發工具&#xff0c;它為基于JVM的云應用開發中涉及的配置管理、服務發現、斷路器、智能路由、微代理、控制總線、全局鎖、決策競選、分布…

js 全選

<form name"frm" method"post" action"/add" onsubmit"return check()"><table class"titem" ><tr><td class"field"> * 所屬批次</td><td class"value"><sele…

結果規格化_結果

結果規格化If you’ve seen an Instagram story involving a question and people tilting their heads, you probably were looking at the “Who Is More” Instagram filter. In this article, I will share the creative process and decision making behind this filter.如…