初始C语言(4)

初始C语言(4)


文章目录

  • 初始C语言(4)
  • 前言
  • 一、#define定义常量和宏
    • 1.定义常量
    • 2.定义宏
  • 二、指针
    • 2.1内存
    • 2.2指针变量的大小
  • 三、结构体
  • 总结


前言

这章笔记涉及#define定义常量和宏以及指针的基本知识。


一、#define定义常量和宏

1.定义常量

#define MAX 1000
#define STR "abcdef"
int main()
{
    printf("%d\n",MAX);
    int a=MAX;
    int arr[MAX]={0};
    printf("%d\n",a);
    printf("%s\n",STR);
    return 0;
}

2.定义宏

宏是有参数的;宏的参数是没有类型的,宏的参数采用的是替换
宏是通过#define定义的
格式: #define 标识符 字符串

//函数
int Add(int x,int y)
{
    return x+y;
}
//宏
define ADD(x,y)    ((x)+(y)))//宏一般用大写
int main()
{
    int a=10;
    int b=20;
    int c=Add(a,b);
    printf("%d\n",c);
}

宏的参数替换:不是传参的机制
a.宏名一般用大写
b.使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。例如:数组大小常用宏定义
c.宏定义末尾不加分号;
d.预处理是在编译之前的处理,而编译工作的任务之一就是语法检查,预处理不做语法检查。
e.宏定义写在函数的花括号外边,作用域为其后的程序,通常在文件的最开头。
f.可以用#undef命令终止宏定义的作用域
g.字符串" "中永远不包含宏
h.宏定义可以嵌套
j.宏定义不分配内存,变量定义分配内存

二、指针

2.1内存

初始C语言(4)_第1张图片
变量是创建内存中的(在内存中分配空间的),每个内存单元都有地址,所以变量也有地址;
编号就是内存单元的地址,编号就是地址;
取出变量地址如下:

int main()
{
    int a=10;//4个字节
  int* pa = &a//pa是创建出来存放地址(指针)的,pa就是指针变量;
  char ch='w';
  char* pc=&ch;
    return 0;
}

当a创建好后,占用4个字节,每个字节都有一个地址(编号)而&a拿到的是第一个字节的地址;
我们把地址也叫做指针,编号=地址=指针;
说明pa是指针变量,int整体是一个类型,int说明的是pa指向的对象是int类型的;
1.指针其实就是地址,地址就是内存单元的编号;
2.把地址进行存储的时候,就可以放到一个变量中,这个变量就是指针变量;
口头语中说的指针一般指的是指针变量!
&是取地址操作符,取出变量的地址;(来)
*是解引用操作符(间接访问操作符),通过地址找到地址指向的内容;(去)

int main()
{
    int a=10;//4个字节
    int* pa = &a//pa是创建出来存放地址(指针)的,pa就是指针变量;
    *pa;//*是解引用操作符,*pa就是通过pa中存放的地址,找到pa指向的空间
     printf("%d\n",a);
    return 0;
}

2.2指针变量的大小

int main()
{
    char ch='a';
    char* pc=&ch;
    //sizeof计算的结果是无符号整数的
    //对应的打印格式应该是%zu
    printf("%d\n"sizeof(char*));
    printf("%d\n"sizeof(pc));
}

sizeof计算的结果是无符号整数的,对应的打印格式应该是%zu
指针变量是用来存放地址的,所以指针变量的大小取决于存储一个地址需要多大空间;
x86——————>32位环境------>4个字节
x64----------------->64位环境------->8个字节

三、结构体

结构体是为了解决基本数据类型没有办法描述生活中某些具体复杂对象的问题的;
C语言提供了:结构体来描述复杂对象;结构体格式如下:

struct Tag
{
    成员列表;
};

具体举例如下:

struct Stu      //结构体类型,相当于模型(图纸)
{
    char name[20];
    int age;
    float score;
};
void Print(struce Stu* ps)
{
    //1.printf("%s %d %f\n",(*ps).name,(*ps).age,(*ps).score);
    结构体指针->结构体成员
    //2.printf("%s %d %f\n",ps->name,ps->age,ps->score);
}
int main(){
    struct Stu s1={"zhangsan",28,95.5f};//字符串也可以是汉字
    Struct Stu s2={"lisi",40,99.8f};
    //.操作符   结构体变量.结构体成员
    //输入数据到s2中
    scanf("%s %d %f",s2.name,&(s2.age),&(s2.score));//因为name是个数组名,所以不用取地址,
                                                    age和score是变量,所以用必须使用&
    printf("%s %d %f\n",s1.name,s1.age,s1.score);
    printf(&s2);
    return 0;
}

ps:浮点数是不能精确保存的,会多一些或者少一些东西;


总结

  这章笔记涉及#define定义常量和宏,指针和内存的关系,指针变量的大小,以及C语言为了描述复杂对象提供的结构体相关知识,希望对大家有所帮助。

你可能感兴趣的:(c语言,算法,开发语言)