初始C语言(2)

初始C语言(2),第1张

初始C语言(2)

目录

函数

数组

什么是数组

数组定义

数组的使用

*** 作符

常见关键词

关键字typedef

关键词static

修饰局部变量

define定义常量和宏

指针

结构体

结语


函数

我们先用前面的基础只是来实现一个加法的小程序,代码如下

#include 
​
int main()
{
    int num1 = 0;
    int num2 = 0;
    int sum = 0;
    printf("输入两个数:>");
    scanf("%d %d", &num1, &num2);
    sum = num1 + num2;
    printf("sum = %dn", sum);
    return 0;
}

可以看到

下面我们用函数的方式实现一下这个代码

#include 
​
int Add(int num1, int num2)
{
    return num1 + num2;
}
​
int main()
{
    int num1 = 0;
    int num2 = 0;
    int sum = 0;
    printf("输入两个数:>");
    scanf("%d %d", &num1, &num2);
    sum = Add(num1, num2);
    printf("sum = %dn", sum);
    return 0;
}

可以看到得到的结果是一样的

那有聪明的小伙伴要问了,既然都一样为什么要写函数呢,我还不如直接写呢。哎别急,这就给你解释解释,你想想,当你实现一个功能需要写50行代码,你如果想第二次使用的话难不成又写50行代码么?显然是不太现实的,当你想要重复使用一个功能时,通过使用形参和函数的方式来会使程序变得更加简洁。所以函数的特点就在于能够简化代码,达到代码复用的功能。


数组

要存储1-10的数字,怎么存储?

C语言中给出了一个东西叫做数组。那数组又是个什么东西呢?

什么是数组

数组,是有序的元素序列,用于储存多个相同类型数据的集合,数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按无序的形式组织起来的一种形式。 这些无序排列的同类数据元素的集合称为数组。

需要注意的是:

    数组是相同数据类型的元素的集合。

    数组中的各元素的存储是有先后顺序的,它们在内存中按照这个先后顺序连续存放在一起。

    数组元素用整个数组的名字和它自己在数组中的顺序位置来表示。

数组定义
int arr[10]={1,2,3,4,5,6,7,8,9,10};//定义一个整形数组,最多放10个元素
数组的使用

接下来我们将上述数组的元素进行输出

#include 
​
int main()
{
    int i = 0;
    int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
    while (i < 10)
    {
        printf("%d ", arr[i]);
        i = i + 1;
    }
    return 0;
}


*** 作符

这里只进行简单介绍,后续遇到后再仔细讲解

算数 *** 作符

+ - * / %

移位 *** 作符

>>  <<

位 *** 作符

&  ^  |

赋值 *** 作符

= += -= *= /= &= ^=  |=    >>=   <<= 

单目 *** 作符

!           逻辑反 *** 作
-           负值
+           正值
&           取地址
sizeof       *** 作数的类型长度(以字节为单位)
~           对一个数的二进制按位取反
--          前置、后置--
++          前置、后置++
*           间接访问 *** 作符(解引用 *** 作符)
(类型)       强制类型转换

关系 *** 作符

>
>=
<
<=
!=   不相等
==   相等

逻辑 *** 作符

&&     逻辑与
||     逻辑或

条件 *** 作符

exp1 ? exp2 : exp3

逗号表达式

exp1, exp2, exp3, …expN

下表引用、函数调用和结构成员

[] () . ->



常见关键词

auto break  case char const  continue default do  double else enum  extern float for  goto if  int  long register   return  short signed sizeof  static struct switch typedef union unsigned  void volatile while

还是一样,这里先简单介绍几个,后面遇到后再进行讲解

关键字typedef
typedef是在计算机编程语言中用来为复杂的声明定义简单的别名

例如:

#include 
​
typedef int uint;//将int重命名为uint
​
int main()
{
    int num1 = 0;
    uint num2 = 0;
    printf("%d %d", num1, num2);
}

可以看到num1和num2实际上是同一类型。只不过类型名称不一样。

关键词static
在C语言中:
static是用来修饰变量和函数的
1. 修饰局部变量-静态局部变量
2. 修饰全局变量-静态全局变量
3. 修饰函数-静态函数
修饰局部变量

观察下面两段代码的差距

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

我们在主函数中循环调用十次打印输出,可以看到结果如下

可以看到test1输出的全是1,而test2输出了1-10。

这是为什么呢?简单的来讲就是说在没有static修饰的情况下,静态局部变量在函数结束后会被处理掉,所以在test1中每次调用都会定义一个i=0,然后i++,完了又被处理掉,但是static修饰后静态成员变量i在函数完了之后保留了下来,即test2中第一次i=1,第二次即使用i=1带入后执行i++ *** 作然后变成2以此类推。

结论:

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

关于static修饰全局变量和函数有兴趣的小伙伴可以自行了解,这里直接给出结论了。

一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用。
一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。
define定义常量和宏
//define定义标识符常量
#define MAX 1000
//define定义宏
#define ADD(x, y) ((x)+(y))
#include int main()
{    
int sum = ADD(2, 3);    
printf("sum = %dn", sum);    
sum = 10*ADD(2, 3);    
printf("sum = %dn", sum);    
return 0;
}

这里需要注意一下的是,#define定义宏的实质其实是替换,假定我们这么定义ADD(x,y)

#define ADD(x,y)  x+y

会出现什么问题呢?

可以看到出来的结果是23而不是预估的50,这是为什么?刚刚提到了实质是替换,即在sum=10×ADD(2,3)语句中实际上ADD(2,3)被替换为2+3,这个时候sum=10×2+3=23。所以在使用define定义宏时一定要注意一下。

指针

要想了解指针,我们需要先知道一点关于内存的小知识。

内存是电脑上特别重要的存储器,计算机中所有程序的运行都是在内存中进行的 。所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。

现阶段我们可以就理解为指针就是那个内存单元的地址,那么我们首先就应该要找到变量的地址即取地址

#include 
​
int main()
{
    int num = 0;
    #//取num的地址
    printf("%p", &num);//%p-->按照地址的形式打印
    return 0;
}

那我们取出地址后如何去保存下来呢?这里我们就需要定义一个指针变量,具体如下

int *p=#

即可保存下来了。

下面我们简单了解下指针的用处

#include 
​
int main()
{
    int num = 0;
    int *p=#//取num的地址
    *p = 20;
    printf("%d", *p);
    return 0;
}

可以看到可以通过指针来修改num的值,那为什么不直接修改num而要通过指针呢?关于这一点我们在后续关于函数内容讲解时再细说,有兴趣的小伙伴可以私聊我或者自行了解。

接下来我们了解一下指针的大小

#include 
​
int main()
{
    printf("%dn", sizeof(int*));
    printf("%dn", sizeof(short*));
    printf("%dn", sizeof(char*));
    printf("%dn", sizeof(double*));
    return 0;
}

这里可以看出指针大小在32位平台是4个字节,64位平台是8个字节。

在这里抛出一个小问题,可以思考一下哈,既然指针的大小都是一样的,那为什么还要区分指针的类型呢?比如说int *和char *类型的指针在32位平台下都是4个字节,为什么要分int 和char呢?有答案的小伙伴可以在评论区留言,在后续指针部分我也会给大家一个我的理解哈。

结构体

结构体是C语言中特别重要的知识点,结构体使得C语言有能力描述复杂类型。比如描述学生,学生包含:名字+年龄+性别+学号这几项信息。这里只能使用结构体来描述了。

struct Stu{    
    char name[20];//名字    
    int age;      //年龄    
    char sex[5];  //性别    
    char id[15]; //学号
};

我们按下述方式来定义一个stu类型是s1

struct stu s1;

可通过s1.的方式来访问他的数据成员,.在这里可以理解为“的”,即s1的名字表示为s1.name,也可以使用s1->name,需要注意的是,.和->的表达实际上效果都是一样的,具体内容我们后续在进行讲解。

结语

关于初始C语言的内容就到此结束了,下一篇我们进入C语言分支与循环语句的学习。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5702695.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存