C語言深入學習二

Sunwenyan_發表於2020-10-04

巨集函式:例如:#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);
}

相關文章