一:结构体初阶
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
数组:一组相同类型的元素的集合
结构体:也是一些值的集合,但是值的类型可以不同
struct B
{
char c;
short s;
double d;
};
struct Stu
{ //struct stu是个类型
//成员变量
struct B sb;
char name[20];
int age;
char id[20];
}s1,s2; //s1,s2也是结构体变量
//s1,s2是全局变量
void print1(struct Stu t)
{
printf("%c %d %lf %s %d %s\n", t.sb.c, t.sb.s, t.sb.d, t.name, t.age, t.id);
}
void print2(struct Stu* ps)
{
printf("%c %d %lf %s %d %s\n", ps->sb.c, ps->sb.s, ps->sb.d, ps->name, ps->age, ps->id);
}
int main()
{
//s是局部变量
struct Stu s = { {'w',20,3.14 }, "张三", 30, "20231014"};//结构体的初始化
printf("%c %s\n", s.sb.c,s.id);//结构体的访问
struct Stu* ps = &s;
printf("%c %s\n", (*ps).sb.c,(*ps).id);
printf("%c %s\n", ps->sb.c, ps->id);
print1(s); //传值调用
print2(&s); //传地调用
//写一个函数打印s的内容
return 0;
}
函数调用的参数压栈
栈,是一种数据结构
先进的后出,后进的先出
int Add(int x, int y) //每一个函数调用都会再内存的栈区上开辟一块空间
{
int z = 0;
z = x + y;
return z;
}
int main()
{
int a = 3;
int b = 5;
int c = 0;
c = Add(a, b);
return 0;
}
二:模拟实现字符串相关函数
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
把src指向的内容拷贝放进dest指向的空间中
从本质上讲,希望dest指向的内容被修改,src指向的 内容不被修改
stycpy这个库函数,其实返回的是目标空间的起始地址
char* my_strcpy(char* dest,const char* src) //标准的进行库函数的模拟实现
{ //加了 const 后 while 中的 *dest++ 和 *src+ 写反了就会出错
assert(src != null); //断言,可以很好的帮忙指出问题出在哪里
assert(dest != null);
char* ret = dest;
while (*dest++ = *src++) //即copy了\0,又使得循环停止
{
;//hello的拷贝
}
return ret;//返回目标空间的起始地址
}
int main()
{
char arr1[20] = "xxxxxxxxxxx";
char arr2[] = "hello";
//strcpy(arr1,arr2);
printf("%s\n", my_strcpy(arr1, arr2)); //链式访问
return 0;
}
int main()
{
//const 修饰变量,这个变量就被称为常变量,不能被修改,但是本质上还是变量
const int num = 10;
const int* p = #
p 是指针变量 *p 是指针指向的内容
const 修饰指针变量的时候
const 如果放在*的左边,修饰的是*p,表示指针指向的内容,是不能通过指针来改变的
但是指针变量本身是可以修改的
如果放在*的右边,修饰的是指针变量p,表示指针变量不能被改变的
但是指针指向的内容是可以修改的
*p = 20;
printf("%d\n", num);
return 0;
}
my_strlen的实现
size_t my_strlen(const char* str) //因为求的长度不可能是负数,所以用int不好
{ //size_t - unsigned int
//assert(str != NULL);
assert(str); //当str == NULL为假
int count = 0;
while(*str != '\0')
{
count++;
str++;
}
return count;
}
int main()
{
char arr[] = "abcdef";
printf("%d", my_strlen(arr));
return 0;
}
__cdec1 -函数调用约定
编程常见错误:
1.编译型错误
2.链接型错误
3.运行时错误