初识C语言(下)

目录

8. 函数

9. 数组

9.1 数组定义:一组相同类型的元素的集合

9.3 数组的下标

9.3 数组的使用

10. 操作符

11. 常见关键字

11.1 typedef

11.2 static

11.2.1 修饰局部变量

11.2.2 修饰全局变量

11.2.3 修饰函数

12. #define定义常量和宏

13. 指针

13.1 内存

13.2 指针变量大小

14. 结构体


8. 函数


#include <stdio.h>

int main()
{
    int num1 = 0;
	int num2 = 0;
	int sum = 0;
	int a = 0;
	int b = 0;
	int c = 0;
	//输入
	scanf("%d %d", &num1, &num2);
	//求和
	sum = num1 + num2;	
	//输出
	printf("%d\n", sum);
	return 0;
}

上述代码写成函数:

int Add(int x, int y)//第一种
{
	int z = 0;
	z = x + y;
	return z;
}

int Add(int x, int y)//第二种
{
	return (x + y);
}

int main()
{
	int num1 = 0;
    int num2 = 0;
    int sum = 0;
	//输入
	scanf("%d %d", &num1, &num2);
	//求和
	sum = Add(num1, num2);
	//输出
	printf("%d\n", sum);
	return 0;
}

函数其实就相当于代码的封装工厂,可以简化代码,重复使用(之后使用代码实现相同功能时可直接调用函数)。


9. 数组

9.1 数组定义:一组相同类型的元素的集合


int arr1[10] = {1,2,3,4,5,6,7,8,9,10};
int arr2[10] = { 1,2,3,4,5};//不完全初始化,剩余的默认初始化为0
char ch[5] = { 'a', 'b', 'c' };//不完全初始化,剩余默认初始化为\0

9.3 数组的下标

数组的每个元素都有一个下标,下标是从0开始的。数组可以通过下标来访问。

  int arr[10]12345678910
      下标0123456789

9.3 数组的使用

#include<stdio.h>

int main()
{
    int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
    printf("%d\n", arr1[6]);
    int i = 0;
    while (i<10)
    {
	    printf("%d ", arr1[i]);//通过下标访问数组
	    i = i + 1;
    }
	return 0;
}

10. 操作符

算术操作符
+   -   *

/ 除号  除号的两端如果都是整数,执行的是整数除法;
       除号的两端至少有一个数是浮点数,才能执行浮点数的除法
% 取模(取余),%操作的两个操作数必须都是整数

移位操作符:<< >>
位操作符:& ^ |
赋值操作符:= += -= *= /= &= ^= |= >>=  <<=

单目操作符

逻辑操作符
-负值
+正值
&取地址
sizeof操作数的类型长度(单位为字节)
~对一个数的二进制按位取反
--前置、后置
++前置、后置(先使用,后++)
*间接访问操作符(解引用)
(类型)强制类型转换
int a = 10;
printf("&d\n",sizeof(a)); 4
printf("&d\n",sizeof(int)); 4
printf("&d\n",sizeof a); 4  括号可省略,因为sizeof不是函数

int arr[10] = {0};
printf("&d\n",sizeof(arr)); 40 计算的是整个数组的大小,单位是字节
printf("&d\n",sizeof(arr[0])); 4
printf("&d\n",sizeof(arr)/sizeof(arr[0])); 10-数组的元素个数

stelen是函数,会统计字符串\0前的字符个数(不包括\0)

逻辑操作符

&&  逻辑与,都真才为真
||  逻辑或,有真即为真

条件操作符

exp1?exp2:exp3
 真   √    ×
 假   ×    √

逗号表达式

exp1,exp2,exp3,………expN
从左向右依次计算,整个表达式的结果为最后一个式子的结果

11. 常见关键字

11.1 typedef

类型定义,把复杂的类型简化,可以理解为类型重命名

typedef unsigned int un_i;//typedef把复杂的类型简化

int main()
{
    unsigned int num1 = 0;
    un_i num2=0;
    return 0;
}

11.2 static

11.2.1 修饰局部变量
#include<stdio.h>

void test1()
{
    int a = 0;
    a++;
    printf("%d ",a);
}

int main()
{
    int i = 0;
    for(i=0;i<10;i++)
    {
        test();
    }
    return 0;
}

结果为10个1


#include<stdio.h>//static修饰局部变量使其出了作用域还有效

void test2()
{
    static int i = 0;
    i++;
    printf("%d",i);
}

int main()
{
    int i = 0;
    for(i=0;i<10;i++)
    {
        test2();
    }
    return 0;
}

结果为1 2 3 4 5 6 7 8 9 10

static修饰局部变量改变了变量的生命周期,让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束。本质上改变了变量的储存位置。

11.2.2 修饰全局变量
代码1:
//add.c
int global_v = 2024;
//test.c
int main()
{
    printf("%d\n",global_v);
    return 0;
}


代码2:
//add.c
static int global_v = 2023;
//test.c
int main()
{
    printf("%d",global_v);
    return 0;
}

代码1正常,代码2会出现错误:一个全局变量被static修饰,使得这个全局变量只在本源文件内使用,不能在其他源文件中使用。感觉作用域变小了,实际外部链接变内部链接。

11.2.3 修饰函数
//声明外部函数
extern int Add(int x, int y);
//修饰函数
int main()
{
	int a = 10;
    int b = 20;
	int c = Add(a, b);
    printf("%d\n", c);
    return 0;
}

与修饰全局变量类似,一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件(不同的.c文件)内使用。

12. #define定义常量和宏

#define MAX 100//定义常量
#define ADD(x,y) ((x)+(y))//定义宏
#include<stdio.h>

int main()
{
    int sum = ADD(2,3);
    printf("sum=%d\n",sum);
    sum = 10*ADD(2,3);
    printf("sum = %d\n",sum);
    return 0;
}

13. 指针

13.1 内存

每个内存单元大小为1个字节。

给内存单元分配的编号被称为该内存单元的地址。

变量是创建在内存中的,所以变量也是有地址的。

#include<stdio.h>

int main()
{
    int num = 10;
    int *p=&num;
    *p=20;
    printf("%p\n",&num);
}
p是一个变量,这个变量是用来存放地址的
而地址又叫指针
所以在C语言中把p叫指针变量(指针变量是存放指针的变量)

&a; & 取地址操作符
printf("%p\n", &a);
&a 取出的是a所占内存的4个字节中第一个字节的地址
#include<stdio.h>

int main()
{
    char ch = 'w';
    char* pc = &ch;
	//通过pc把ch的值改'b'
    *pc = 'b';
    printf("%c\n", *pc);//b
    ch = 'q';
    printf("%c\n", *pc);//q
    return 0;
}

1. 指针就是地址
2. 口头语中指针一般指的是指针变量

13.2 指针变量大小

#include<stdio.h>

int main()
{
    printf("%d\n",sizeof(char*));
    printf("%d\n",sizeof(short*));   
    printf("%d\n",sizeof(int*));
    printf("%d\n",sizeof(double*));
    return 0;
}

指针变量的大小取决与地址的大小;32位平台下的地址是4个字节;64位平台下的地址是8个字节

不论什么类型的指针,都是在创建指针变量。


14. 结构体

结构体可以使C语言有能力描述复杂类型。

比如描述一个包含众多特征的一类群体。

//学生:名字+性别+年龄

//定义一个学生类型
struct Stu
{
    char name[20];
    char sex[5];
    int age;
};

void Print(struct Stu* ps)
{
    printf("%s %s %d\n", (*ps).name, (*ps).sex, (*ps).age);
    //结构体的指针->成员名
    printf("%s %s %d\n", ps->name, ps->sex, ps->age);
}

int main()
{
    int num = 0;
    struct Stu s = {"lisi", "男", 22};
    struct Stu s2 = { "zhangsan", "女", 18 };
    Print(&s);   
    //结构体变量.成员名
    printf("%s\n", s2.name);
    printf("%s\n", s2.sex);
    printf("%d\n", s2.age);

    return 0;
}

本章完。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值