C語言深入學習二
巨集函式:例如:#define ADD ((x)+(y));
1:要保證運算的完整性
2:在一定程度上會比普通函式效率高,省去出棧入棧 時間上的開銷。
3:以空間換時間
#include<stdio.h>
#include<stdlib.h>
#define ADD(x,y) ((x) + (y));
int main(){
int a = 40, b = 20,c;
c = ADD(a,b);
printf("%d", c);
}
呼叫慣例:
1:C語言預設使用cdecl。
2:包含:出棧方(主調函式管理被調函式),引數的傳入順序(從右向左),函式名稱的修飾。
變數傳遞分析:
1:棧:主函式的變數子函式可以使用,自函式的變數主函式不可以使用。注意多級子函式。在子函式中的改變與主函式無關。
2:堆:其在子函式的變數主函式也可以使用只要不用釋放。在子函式中的改變影響主函式。
棧的生成方向:棧底是高地址,棧頂是低地址。
程式碼如下:
#include<stdio.h>
#include<stdlib.h>
int main(){
int a = 10;
int b = 9;
int c = 8;
int d = 7;
int e = 6;
int f = 5;
printf("%d\n",&a);
printf("%d\n",&b);
printf("%d\n",&c);
printf("%d\n",&d);
printf("%d\n",&e);
printf("%d\n",&f);
}
記憶體儲存方式:高位元組對應高地址,低位元組對應低地址。
空指標和野指標;
1:空指標int *p = null; int *p = 0x0002; //胡亂的賦地址不行
2:野指標:
int *p; //這是第一種情況
//這是第二種情況
#include<stdio.h>
void pointer(int *p){
free(p);
p = NULL; //這不是更高階的指標,所以並不能使指標為空。
}
int main(){
int *q = (int *)malloc(sizeof(int)*5);
q[0] = 0;
q[1] = 1;
q[2] = 2;
q[3] = 3;
q[4] = 4;
pointer(q);
}
//這是第三種情況 在子函式中定義的變數在該函式結束後變數被清空。
#include<stdio.h>
int *pointer1(){
int *p = (int *)malloc(sizeof(int)*5)
q[0] = 0;
q[1] = 1;
q[2] = 2;
q[3] = 3;
q[4] = 4;
return p;
}
int main(){
int *q = pointer1();
for(int i=0;i<5;i++)
printf("%d",q[i]);
指標的步長:
char指標每加1跳動一個位元組。
int指標每加1跳動四個位元組。
float指標每加1跳動四個位元組。
double指標每加1跳動8個位元組。
指標的間接賦值:
#include<stdio.h>
int main(){
int a;
int *p;
p = &a;
*p = 5;
printf("%d",*p);
}
拷貝字元:
//拷貝一
#include<stdio.h>
#include<string.h>
#include<math.h>
void Copy(char str1[], char *str2, int len)
{
for (int i = 0; i < len; i++)
{
str2[i] = str1[i];
}
str2[len] = '\0';
}
int main() {
char str1[1024] = "nihaohaha";
char str2[1024];
int len = strlen(str1);
Copy(str1, str2,len);
printf("%s", str2);
}
//拷貝二
#include<stdio.h>
#include<string.h>
#include<math.h>
void Copy(char *str1, char *str2, int len)
{
for (int i = 0; i <= len; i++)
{
*str2 = *str1;
str2++;
str1++;
}
}
int main() {
char *str1 = "nihaohaha";
char str2[1024];
int len = strlen(str1);
Copy(str1, str2,len);
printf("%s", str2);
}
//拷貝三
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main() {
char *str1 = "nihaohaha";;
int len = strlen(str1);
char *str2 = malloc(sizeof(char) * (len + 1)); //void返回的是萬能指標void*
memcpy(str2, str1, (len + 1));
printf("%s", str2);
}
指標的反轉:
#include<stdio.h>
#include<string.h>
#include<math.h>
void Copy(char* str1, char* str2, int len)
{
str1 = str1 + len - 1;
for (int i = 0; i <= len; i++)
{
*str2 = *str1;
str2++;
str1--;
}
}
int main() {
char* str1 = "nihaohaha";
char str2[1024];
int len = strlen(str1);
Copy(str1, str2, len);
printf("%s", str2);
}
sprintf()字串拼接/格式化字串:
#include<stdio.h>
#include<string.h>
#include<math.h>
int main() {
char str[1024];
int year = 100;
sprintf(str, "哇塞,我今年已經%d歲了", year);
printf("%s", str);
}
malloc(sizeof()*size) , calloc(size,sizeof()) , realloc(primary,sizeof()*size)
sscanf()的使用:
#include<stdio.h>
#include<string.h>
#include<math.h>
int main() {
char exp1[1024] = "ascvde@你猜我去掉了啥?哈哈。";
char exp2[1024] = "buhaohou1234567";
char str1[1024], str2[1024], str3[1024];
sscanf(exp1, "%[a-z]%*[@]%s", str1,str2);
sscanf(exp2, "%*8s%s",str3);
printf("%s%s\n", str1,str2);
printf("%s",str3);
}
查詢子串:
#include<stdio.h>
#include<string.h>
#include<math.h>
int Compare(char* exp, char* find) {
char *e1 = exp;
char *f1 = find;
int len1=0, len2=0, len3=0, lene;
len1 = strlen(find);
lene = strlen(exp);
while (*e1 != '\0') {
char *e2 = e1;
char *f2 = f1;
if (*f2 == *e2) {
while (*e2 != '\0')
{
len2++;
f2++;
e2++;
if (*f2 != *e2) {
break;
}
}
}
if (len2 == len1)
break;
else {
e1++;
e2 = e1;
f2 = f1;
len3++;
len2 = 0;
}
}
if (len3 < lene)
return len3+1;
else
return -1;
}
int main() {
char *exp = "asdfgh";
char *find = "fgh";
int len;
len = Compare(exp, find);
if (len == -1)
printf("沒有連續相同的選項");
else
printf("有相同的連續選項,初始位置為%d", len);
}
使用const定義形參說明這個值不能修改。不能在子函式中修改。
二級指標–檔案讀寫:
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
int getFileLine(FILE* file) {
int line = 0;
char butf[1024];
while (fgets(butf, 1024, file) != NULL)
{
line++;
}
fseek(file,0,SEEK_SET);
return line;
}
void getFileElement(FILE *file, char **filetext, int len)
{
char butf[1024];
int index = 0;
while (fgets(butf, 1024, file) != NULL)
{
int num = strlen(butf) + 1;
char *current_file = (char *)malloc(sizeof(char)*num);
strcpy(current_file, butf);
filetext[index++] = current_file;
memset(butf,0,1024);
}
}
void showFileElement(char **filetext, int len) {
for (int i = 0; i < len; i++)
{
printf("%s", filetext[i]);
}
}
void clearPile(char **filetext, int len)
{
for (int i = 0; i < len; i++)
{
free(filetext[i]);
filetext[i] = NULL;
}
free(filetext);
filetext = NULL;
}
int main() {
FILE* file = fopen("text.txt", "r");
int len = getFileLine(file);
char** filetext = (char **)malloc(sizeof(char*) * len);
getFileElement(file, filetext, len);
showFileElement(filetext, len);
clearPile(filetext, len);
}
相關文章
- C語言學習方法,怎麼學習C語言?C語言
- C語言再學習C語言
- C語言學習心得C語言
- c語言基礎學習C語言
- C語言指標學習C語言指標
- C 語言學習筆記筆記
- C語言學習 相同元素C語言
- C語言學習筆記C語言筆記
- GO語言學習——切片二Go
- C/C++語言的學習方向C++
- c語言程式設計學習之二維陣列C語言程式設計陣列
- 我的C語言學習之路C語言
- C語言學習記錄_2019.02.06C語言
- C語言學習筆記--C運算子C語言筆記
- 學習C語言還是學習Python爬蟲?C語言Python爬蟲
- 怎樣快樂學習C語言C語言
- c語言學習筆記===函式C語言筆記函式
- 組合語言-學習記錄(二)組合語言
- 《JavaScript語言精粹》學習筆記二JavaScript筆記
- 深入學習javascript函數語言程式設計JavaScript函數程式設計
- C語言實驗二C語言
- c語言複習C語言
- go語言面試選擇題11道(4)go語言深入學習Go面試
- 初識C語言(01)—學習筆記C語言筆記
- C語言學習筆記——位運算C語言筆記
- C語言學習的幾個階段C語言
- c語言程式基礎學習筆記C語言筆記
- C語言學習筆記之變數C語言筆記變數
- C語言學習之:指標與字串C語言指標字串
- C語言學習之求各因子之和C語言
- spaCy 學習 第二篇:語言模型模型
- 深入學習Redis(二)Redis
- C#語言————第二章 C#語言快速熱身C#
- 嵌入式學習資源——深入理解C語言指標的奧秘-2C語言指標
- 嵌入式學習資源——深入理解C語言指標的奧秘-1C語言指標
- 學習C語言的第一天C語言
- 1.C語言有關的小學習C語言
- C#與Lua語言學習對比一C#