C语言核心基石:编译链路、函数封装与调用、字符数组与字符串(区别sizeof,strlen)、字符串函数的指针实现方案

、编译链接原理

  • 编译

    • 预编译

      • 处理#include ,宏值替换(#define MAX 100)等预处理指令

      • 生成扩展后的源代码文件(如.i文件)

    • 编译

    • 汇编

    • 链接

  • 运行

函数----->功能封装

设计函数结构:

  • 返回值类型------>所有类型 void

  • 函数名---->见明知意-->标识符:数字(不能以它开头)、字母、下划线

  • 形式参数列表(形参和实参)

  • 函数体{ }(函数体内不允许scanf,printf 除非提示)

三、指针大小和系统有关,永恒不变(如x86--->4字节)

int GetSum(int p[],int len)
{
    //参数p已经退化为--->指针-->不可算长度
    int sum=0;
    for(int i=0;i

四、函数调用

C语言核心基石:编译链路、函数封装与调用、字符数组与字符串(区别sizeof,strlen)、字符串函数的指针实现方案_第1张图片

五、字符数组,字符串

char str1[]={'h','e','l','l','0'};
char str2[]={'h','e','l','l','0','\0'};
char str3[]="hello";(隐藏'\0)
//str1--->字符数组
//str2,str3--->等价
1.数组长度-->数组容量:
    str1:5
    str2:6
    str3:6
   int len=sizeof(str3)/sizeof(str[0]);-->6(包含'\0')
2.字符串求长度-->只关心有效字符长度('\0'前):
    int len=strlen(str3);-->5(不包含'\0');
//strlen-->从开头到'\0'之前结束

自定义关于字符串类型函数(指针操作版本)

  • strcpy

#if 0
void mystrcpy(char*p,char str[])
{
	int i = 0;
	while (*p++ = *str++);
    //先进行赋值-->再比较(因此含有'\0)
}
int main()
{
	char str[] = "hello";
	char p[100];
	mystrcpy(p, str);
	printf("%s", p);
	return 0;
}
#endif
  • strcmp

#if 0
int mystrcmp(char* p, char str[])
{
	/*while (*p|| *str)
	{
		if (*p > *str)
			return 1;
		else if (*p< *str)
			return -1;
		else
		{
			p++; str++;
		}
    }
	return 0;*/
	int i = 0;
	while (p[i] == str[i])
	{
		if (p[i] == '\0')
		{
			return 0;
		}
		i++;
	}
	return p[i] > str[i] ? 1 : -1;


}
int main()
{
	char str[] = "az";
	char p[]="az";
	printf("%d", mystrcmp(p, str));
	return 0;
}
  • strcat

#if 1
void mystrcat(char* p, char str[])
{
	while (*p++);
	p--;//指向了p中'\0'的后一个元素---->回退
	while (*p++ = *str++);
}
int main()
{
	char p[100] = "hello";
	char str[]="world";
	mystrcat(p, str);
	printf("%s", p);
	return 0;
}
#endif

你可能感兴趣的:(c语言)