太久沒有看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)實現中發現乙個問題:char a 與 char *a 的區別} return null;
}
char a在執行時賦值,值會從靜態區賦值到函式的棧中,對它進行修改不會產生任何問題。char *a在編譯時就確定了,a指向靜態區中的值,沒有賦值到函式棧中, 因此對指標的內容進行修改會產生錯誤。
這個問題詳細解釋:
2.
char * match(char * str,char const *substr)3.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;
}
void reverse_string(char *str)int vector[10], *vp = vector; 這個宣告是合法的,它為整型陣列分配記憶體,並把vp 宣告為指向整型的的指標。p = str;
char * end = p + count -1;
while(p < end)
*(str+count) = '\0';
printf("%s\n",str);
}
int matrix[2][3] matrix 並不是指向整型的的指標,而是乙個指向整型陣列的指標,我們應該如何宣告指向陣列的指標?
int (*mp)[3]這裡要帶上第二維的資料控制,不是mp指標自增操作不確定能跳過多少長度。
int matrix[2][3] = ,};如上**,指標p 指向陣列中第乙個元素,然後指標自增1 ,指向了第二個數字,所以上面輸出就是:1,2,3 ,我們一直要確定好一件事情就是指標型別,因為型別決定了指標自增1是能跳動多大的距離。int *p = &matrix[0][0];
printf("%d\n",*p);
printf("%d\n",*++p);
printf("%d\n",*++p);
int matrix[2][3] = ,};所以上述**輸出:1,2,4 這裡就可以告訴我們如何去對二維陣列元素通過指標進行操作。int (*mp)[3];
mp = matrix;
printf("%d\n",(*mp)[0]);
printf("%d\n",(*mp)[1]);
printf("%d\n",(*++mp)[0]);
正如你可以建立整型陣列一樣,你也可以宣告指標陣列,如下面:
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)這裡需要注意為什麼kwp 定義為指標的指標? 分析一下,keyword_table 是陣列起始位置是指標,而陣列中元素也是指標,所以當要引用陣列中元素時必須定義為指標的指標來遍歷該陣列。} return -1;
}
如果上述結構定義為二維陣列這樣:
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.方法遞迴 迴圈 方法自己呼叫...