C語言重要知識點回顧

2022-05-23 03:57:07 字數 3458 閱讀 9860

太久沒有看c語言相關知識了,開始要整理回顧一些重點知識點啦,因為各大公司筆試還是有許多c語言相關的題,做個複習。

普通指標使用:

//普通指標使用,我們通過 i 或者 p 指標都能改變變數值

void test1()

輸出結果:

這個結果是我們好理解的。

接著 const int *p 問題

// const int *p 表示p 所指的物件是唯讀不可以改變的,但p 指標可以指向其他位址

void test2()

輸出結果:

這裡我們發現指標p 我們可以隨便調整指向哪塊已知的記憶體空間,但是不能通過 給*p 複製來改變指標所指的物件。

int const *p 和上面const int *p  效果一樣這裡就不多說啦。

接下來說 int * const p 形式,如下測試**:

// int * const p 表示指標p 不可修改,但是指標p 所指向的內容可以修改

void test3()

輸出結果:

最後一種情況就是上面情況結合在一起const int * const p 這樣就是p 指標無法修改,p 指標所指的內容也無法修改。

1.

char * find_char(char const * source , char const *chars)

} return null;

}

實現中發現乙個問題:char a 與 char *a 的區別

char a在執行時賦值,值會從靜態區賦值到函式的棧中,對它進行修改不會產生任何問題。char *a在編譯時就確定了,a指向靜態區中的值,沒有賦值到函式棧中, 因此對指標的內容進行修改會產生錯誤。

這個問題詳細解釋:

2.

char * match(char * str,char const *substr)

return str;

}int del_substr(char *str,char const *substr)

if(*str == null)

return 0;

printf("outside\n");

while((*str) != '\0')

printf("%s\n",orig);

return 1;

}

3.

void reverse_string(char *str)

p = str;

char * end = p + count -1;

while(p < end)

*(str+count) = '\0';

printf("%s\n",str);

}

int vector[10], *vp = vector; 這個宣告是合法的,它為整型陣列分配記憶體,並把vp 宣告為指向整型的的指標。

int matrix[2][3] matrix 並不是指向整型的的指標,而是乙個指向整型陣列的指標,我們應該如何宣告指向陣列的指標?

int (*mp)[3]這裡要帶上第二維的資料控制,不是mp指標自增操作不確定能跳過多少長度。

int matrix[2][3] = ,};

int *p = &matrix[0][0];

printf("%d\n",*p);

printf("%d\n",*++p);

printf("%d\n",*++p);

如上**,指標p 指向陣列中第乙個元素,然後指標自增1 ,指向了第二個數字,所以上面輸出就是:1,2,3 ,我們一直要確定好一件事情就是指標型別,因為型別決定了指標自增1是能跳動多大的距離。

int matrix[2][3] = ,};

int (*mp)[3];

mp = matrix;

printf("%d\n",(*mp)[0]);

printf("%d\n",(*mp)[1]);

printf("%d\n",(*++mp)[0]);

所以上述**輸出:1,2,4 這裡就可以告訴我們如何去對二維陣列元素通過指標進行操作。

正如你可以建立整型陣列一樣,你也可以宣告指標陣列,如下面:

int *api[10] ,api 有十個元素,每個元素是指向int 型的指標。

再看個複雜點結構:

char const *keyword = ;
keyword 是乙個指標陣列,陣列中每個元素都指向乙個char型陣列。當我們需要查詢某個關鍵字時可以遍歷該指標陣列,如下:

int lookup_keyword(char const * const desired_word,char const *keyword_table,int const size)

} return -1;

}

這裡需要注意為什麼kwp 定義為指標的指標? 分析一下,keyword_table 是陣列起始位置是指標,而陣列中元素也是指標,所以當要引用陣列中元素時必須定義為指標的指標來遍歷該陣列。

如果上述結構定義為二維陣列這樣:

char const keywordmatrix[9]=;
實現上述查詢相同功能則需要進行改動:

int lookup_keywordmatrix(char const * const desired_word,char const (*keyword_table)[9],int const size)

*listpoint;

void insert_node(linklist **head,int value)

linklist * new_node = (linklist *)malloc(sizeof(linklist));

//好的程式設計習慣需要每次分配記憶體檢查

if(new_node == null)

new_node->value = value;

new_node->next = current;

// 意味著插入鍊錶起始位置

if(pre == null)

else

}void print_linklist(linklist *head)

while(head !=null) }

int main()

; listpoint head = null;

for(int i=0;i<6;i++)

print_linklist(head);

for(int i=0;i<6;i++)

return 0;

}

c 知識點回顧

過載只與函式的引數有關,而與函式的返回型別無關 int 形參 實參 0 char short int double 形參 實參 float double 用省略號 表示,即函式可以有任意個任意型別的引數。如,int printf const char format,在乙個函式中,可指定多個 甚至全部...

知識點回顧

回顧 簡介 python 安裝 python3.8.5 why?python解釋型語言,安裝python3 直譯器 lib pip命令 pip list pip install x pip uninstall 解除安裝 pip install 版本號 pip freeze requiremente....

知識點回顧

方法 變數作用域 方法過載 ref 引用傳參,側重於在方法中一定要修改引數,傳入方法前必須賦值 out 側重於輸出,方法返回前 引數使用前 必須賦值 params 可變引數,只能修飾陣列型別,只能在方法列表的最後.如果沒有給可變引數賦值,那麼可變引數會自動初始化長度為0.方法遞迴 迴圈 方法自己呼叫...