初识C语言——指针初步

初识C语言

define定义常量和宏

define定义常量

#define

#include 预处理指令

#include<stdio.h>
#define M 1000 
#define M SIZE 10

int main(){
    int arr[SIZE];
    printf("%d\n",SIZE);
    
    return 0;
}

define定义宏

宏是有参数,和函数很像

//函数
int Add(int x,int y){
    return x+y;
}
//宏
#define ADD(x,y) ((x)+(y))

​ | |

​ 代表宏定义中的参数 宏定义里的内容

与函数的区别:函数参数有具体的类型

宏带括号:当成整体使用

宏和函数使用上的区别?

指针初步

内存

内存-------> 分割成内存单元------->内存单元的编号:地址 一个单元的大小为1字节

32位机器上:32根地址线 命令的执行:是/否 1/0------>化为二进制 即:32个0或1产生的二进制序列

通过地址找到内存单元,一个地址管理一个字节,能产生2的32次方自己的空间------->管理4GB的空间

编号=地址=指针

int a=10;       	//向内存中申请4个字节的空间
//2进制来表示:00000000 00000000 00000000 00001010
//16进制(4个二进制位表示1个16进制位) 00 00 00 0a
//内存中的表示(把最低位提前) 0a 00 00 00
&a;            	   //取地址符,取出a所占4个字节中第一个字节的地址
printf("%p\n",&a)   //%p - 打印地址(显示的是16进制)
pa=&a;              //pa是存放地址的变量,叫做指针变量

关于指针变量的理解:pa保存了a所占4个字节中第一个字节的地址,即可用pa有能力找到(指向)这个内存空间

int *pa=&a;         //*说明pa是指针变量,而pa指向的对象是int类型

指针,本质是地址;口头语中说的指针是:指针变量

int main(){
    int a=10;
    int *pa=&a;
    *pa=20;        //*是解引用操作,pa指向的a的地址,而*pa即代表的就是a,通过对*pa赋值即可对a操作
    return 0;
}

指针变量的大小

要知道指针变量的大小------>地址存储需要多大空间------>32位机器,地址是32个二进制,存储需要32bit的空间,因此在32位机器上,指针变量的大小是4个字节。

同理:64位机器上指针变量的大小是8个字节

int main()
{
	printf("%zu\n", sizeof(char*));
	printf("%zu\n", sizeof(short*));
	printf("%zu\n", sizeof(int*));
	printf("%zu\n", sizeof(long*));
	printf("%zu\n", sizeof(float*));
	printf("%zu\n", sizeof(double*));

	return 0;
}
//%zu:专门用于打印sizeof的打印值的

指针需要正确使用,不能在未指向地址之前就进行操作(野指针)

结构体

内置类型 char,short,int,long,long long,float,double------>对单一对象的描述

对复杂对象的描述------>结构体

例如:

struct Stu       //struct:结构体关键字   Stu:结构体名称
{
	char name[20];
	int age;
	char sex[5];
	char id[12];
};

通过结构体类型构造出结构体变量——实例化我们定义的类型即为struct Stu

int main()
{
    struct Stu s={“kevin”,20,“male”,“30”};      //其中s叫结构体变量,初始化
    printf("%s %d %s %s %s\n",s.name,s.age,s.sex,s.id);
    //格式: 结构体变量.结构体成员    
    return 0;
}

到这里我们不妨创造一个函数来打印结构体

void print_struct(struct Stu *ps)

​ | | |

​ 函数名 变量类型 指针变量

理解:当创造一个结构体后,我们即将整个结构体看成一个新的我们自己定义的变量类型,使用方法同int等

所以函数书写如下:

void print_struct(struct Stu *ps)
{
    printf("%s %d %s %s %s\n",(*ps).name,(*ps).age,(*ps).sex,(*ps).id);
    //另一种写法:printf("%s %d %s %s %s\n",ps->name,ps->age,ps->sex,ps->id);
    //ps-> 代表ps指向的成员
    //格式:结构体指针->结构体成员
}

现在,我们不妨思考另一种初始化结构体的操作:让用户输入

struct Stu s={0};         //空
//输入
scanf("%s %s %s %d",s.name,s.sex,s.id,&(s.age))

上述前三个都是以数组才保存,数组名本来就是地址,所以不用取地址符,而age作为变量名,需要取地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值