【C语言】 条件操作符 -- 逗号表达式 -- []下标访问操作符,()函数调用操作符 -- 常见关键字 -- 指针 -- 结构体

简介: 【C语言】 条件操作符 -- 逗号表达式 -- []下标访问操作符,()函数调用操作符 -- 常见关键字 -- 指针 -- 结构体

ps:接上一篇,本篇继续先讲操作符。

4.条件操作符(三目操作符)

注:不建议去嵌套使用,使其变得复杂。

exp1 ? exp2 : exp3 这里的exp是表达式

exp条件成立吗?成立为exp2,不成立为exp3。

举例:

#include <stdio.h> 
int main() 
{
    int a = 1;
    int b = 3;
    int m = (a > b ? a : b);
    printf("%d\n", m);//打印出来就是b的值3
    return 0;
}

5.逗号表达式

exp1, exp2, exp3, …… expN

特点:表达式从左到右依次进行计算,但是整个表达式结果是最后一个表达式的结果。

举例:

#include <stdio.h> 
int main()
{
    int a = 1;
    int b = 2;
    int c = 3;
    int res = (a = a + 1, b = b + a, c = c + b);
    printf("%d\n", res);//打印出来是res为7
    return 0; 
}

6.[ ] - 下标访问操作符,()- 函数调用操作符

举例:

int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}; 打印数字3。

#include <stdio.h>
int main()
{   
    int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};//这里的[]是创建时的一个语法,不是操作符
    printf("%d\n", arr[2]);//注:这里的arr和2是[]的操作数
    return 0;
}
#include <stdio.h>
int Add(int x, int y)
{
    return x + y;
}
int main()
{
    int a = 1;
    int b = 2;
    int res = Add(a, b);//这里的()就是函数调用操作符。Add,a,b是函数操作数
    printf("%d\n", res);
    return 0;
}

本篇新开内容从下面一行开始。

1、常见关键字

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

由于本人能力有限,这里给大家列举一部分。

1.1 auto关键字

在局部变量之前用,因为局部变量就是自动变量,可以省略,一般不写。

举例:

#include <stdio.h>
int main()
{
    auto int a = 10;//局部变量,在局部范围里自动创建,自动销毁
    return 0;
}

1.2 break关键字

在循环语句,switch语句中使用,意为终止。

1.3 typedef关键字:类型重命名 - 别名

如果定义变量名太长,使用它可以将名字改的短一点,要是大量使用就可以变得简单一些

举例:

#include <stdio.h>
typedef unsigned int unit;//将unsigned int改为了unit
int main()
{
    unsigned int num = 100;
    unit num = 100;
    return 0;
}

1.4 static关键字(静态的)

作用:(1)修饰局部变量。(2)修饰全局变量。(3)修饰函数

(1) 修饰局部变量:本质是存储位置发生变化,一个普通的局部变量是放在栈区的,而被static修饰的局部变量,是放在内存的静态区的,到了静态区,局部变量出了作用域不会销毁,影响了生命周期,但是作用域没有受影响。即修饰之后只创建一次,一直到程序结束被销毁。

举例:

#include <stdio.h>
void test()
{
    static int a = 1;//main函数在调用test函数打印时,循环10次都应该是2.但是用static修饰之后,每一次的a都被保存了下来,所以就实现了不断+1,打印出来是2~11。
    a++;
    printf("%d ", a);
}
int main()
{
    int i = 0;
    while(i < 10)
    {
        test(); 
        i++;
    }
    return 0;
}

(2) 修饰全局变量: static修饰全局变量这时全局变量的外部链接属性就变成了内部链接属性,只能在自己的.c文件中用,其他的.c文件那无法使用。

举例:



在Add.c文件中写的全局变量本来在test.c文件中声明外部符号就可以正常使用,但是用static修饰之后就不能使用了,限制了作用域。


(3)static修饰函数:static修饰外部函数这时外部函数的外部链接属性就变成了内部链接属性,只能在自己的.c文件中用,其他的.c文件那无法使用。

举例:




1.5 define 定义常量和宏

举例:

#include <stdio.h>
//#define 常量和宏
#define M 100
#define STR "abcdef"
#define MAX(x, y) ((x) > (y) ? (x) : (y)) //定义宏 运用三目操作符对传进来的数字进行比较
int main()
{
  printf("%d\n", M);//这里打印结果就是100
  printf("%s\n", STR);//打印结果就是abcdef
  int a = 10;
  int b = 20;
  int m = MAX(a, b);//调用define定义的宏,对a,b进行比较
  printf("%d\n", m);//打印结果是20
  return 0;
}

2.指针

2.1 内存

2.1.1 一个内存单元多大比较合适呢?

电脑内存由小到大: TB -> GB -> MB -> KB -> byte(字节) -> bit(比特位)
1 byte = 8 bit , 1 KB =1024 byte

如果一个内存单元是bit太细,不合适,所以byte是最合适的,在创建char类型时最小也是一个字节,创建的时候char ch,正好是一个字节,所以使用字节最为合适.
举例:我们买快递的时候填写详细地址,***省***市***区***街道*号楼*单元***,这是很详细了,这里就相当于到字节.再详细不会到具体家里哪个房间哪一平米了,这就相当于比特位了,比特位最小了.



2.1.2 内存单元的编号怎么产生?

地址的产生:32位机器上,32根地址线(电线),电线是通过高电频,低电频 ,转化成数字信号 1 / 0(二进制),能组成2^32(4294967296)个二进制序列,也就可以管理2^32个内存空间.分别为:


00000000000000000000000000000000


00000000000000000000000000000001


...


...


...


11111111111111111111111111111110


11111111111111111111111111111111


这些就分别对应了一个内存单元.

2.1.3 代码举例指针

#include <stdio.h>
int main()
{
  int a = 10;
  int* pa = &a;//pa叫指针变量, & - 取地址操作符
  printf("%d\n", a);//打印结果是10
  *pa = 20;//* - 解引用操作符
  printf("%d\n", a);//打印结果是20
  printf("%d\n", *pa);//和上面一行是一样的意思
  return 0;
}

注:* 说明pa是指针变量,int 说明pa指向对象是int类型的,& -- 取地址操作符, * -- 解引用操作符(pa存放了地址,用 * 可以找出来a)。

2.1.3.(1)

打印地址:用 %p

举例:

#include <stdio.h>
int main()
{
  int a = 10;//向内存申请4个空间存储10
  printf("%p\n", &a);//& - 取地址符,&a 实际占用4个字节的空间,每个字节都有空间,但是&a拿到的是第一字节的地址(也就是小的地址)
  return 0;
}


2.1.3.(2)


指针变量的大小是多大?


指针变量是用来存放地址的。


地址是:


32位机器上:32个0/1组成的二进制序列,需要32bit位的空间存储,指针变量就需要4个字节。


64位机器上:64个0/1组成的二进制序列,需要64bit位的空间存储,指针变量就需要8个字节。


举例:

#include <stdio.h>
int main()
{
  char* p1;
  int* p2;
  double* p3;
  printf("%d\n", sizeof(p1));// 4/8
  printf("%d\n", sizeof(p2));// 4/8
  printf("%d\n", sizeof(p3));// 4/8
    printf("%d\n", sizeof(char*));// 4/8
  printf("%d\n", sizeof(int*));// 4/8
  printf("%d\n", sizeof(double*));// 4/8
//32位机器打印结果时4,64位机器打印结果就是8.
  return 0;
}

3.结构体(struct)

结构体是C语言一个重要知识点,可以使C语言有能力描述复杂类型。

描述一个学生(名字 + 年龄 + 性别 + 学号)举例

#include <stdio.h>
//结构体类型
struct Student
{
  char name[20];//名字
  int age;//年龄
  char id[15];//学号
  float score;//成绩
};
int main()
{
    //结构体对象
  struct Student s1 = { "张三", 20, "21610108252698", 88.2f };
  printf("%s %d %s %f\n", s1.name, s1.age, s1.id, s1.score);
    //用指针的方式写
  struct Student* p = &s1;
    //用结构体变量.成员 方式打印
  printf("%s %d %s %f\n", (*p).name, (*p).age, (*p).id, (*p).score);
    //用结构体指针->成员 方式打印(和上面打印结果是一样的)
  printf("%s %d %s %f\n", p->name, p->age, p->id, p->score);
  return 0;
}

把结构体看成盖房子,结构体类型就像是图纸,按着图纸盖房子。




相关文章
|
存储 NoSQL 编译器
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
指针是一个变量,它存储另一个变量的内存地址。换句话说,指针“指向”存储在内存中的某个数据。
631 7
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
|
存储 编译器 C语言
【C语言】指针大小知多少 ?一场探寻C语言深处的冒险 !
在C语言中,指针的大小(即指针变量占用的内存大小)是由计算机的体系结构(例如32位还是64位)和编译器决定的。
1915 9
|
安全 程序员 C语言
【C语言】指针的爱恨纠葛:常量指针vs指向常量的指针
在C语言中,“常量指针”和“指向常量的指针”是两个重要的指针概念。它们在控制指针的行为和数据的可修改性方面发挥着关键作用。理解这两个概念有助于编写更安全、有效的代码。本文将深入探讨这两个概念,包括定义、语法、实际应用、复杂示例、最佳实践以及常见问题。
670 7
|
存储 人工智能 Java
一文轻松拿捏C语言的指针的基础使用
本文介绍了C语言中的指针概念,包括直接访问和间接访问内存的方式、指针变量的定义与使用、取址运算符`&`和取值运算符`*`的应用,帮助读者深入理解指针这一C语言的核心概念。君志所向,一往无前!
463 0
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
算法 C语言
C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项
本文深入讲解了C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项,通过实例演示了文件操作的基本流程,帮助读者掌握这一重要技能,提升程序开发能力。
1041 3
|
程序员 C语言
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门。本文深入探讨了指针的基本概念、声明方式、动态内存分配、函数参数传递、指针运算及与数组和函数的关系,强调了正确使用指针的重要性,并鼓励读者通过实践掌握这一关键技能。
404 1
|
存储 算法 C语言
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
1008 23
|
12月前
|
存储 C语言
`scanf`是C语言中用于按格式读取标准输入的函数
`scanf`是C语言中用于按格式读取标准输入的函数,通过格式字符串解析输入并存入指定变量。需注意输入格式严格匹配,并建议检查返回值以确保读取成功,提升程序健壮性。
1614 0
|
安全 C语言
C语言中的字符、字符串及内存操作函数详细讲解
通过这些函数的正确使用,可以有效管理字符串和内存操作,它们是C语言编程中不可或缺的工具。
565 15