【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;
}

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




相关文章
|
12天前
使用指针访问数组元素
【10月更文挑战第30天】使用指针访问数组元素。
28 3
|
24天前
|
C语言
【c语言】指针就该这么学(1)
本文详细介绍了C语言中的指针概念及其基本操作。首先通过生活中的例子解释了指针的概念,即内存地址。接着,文章逐步讲解了指针变量的定义、取地址操作符`&`、解引用操作符`*`、指针变量的大小以及不同类型的指针变量的意义。此外,还介绍了`const`修饰符在指针中的应用,指针的运算(包括指针加减整数、指针相减和指针的大小比较),以及野指针的概念和如何规避野指针。最后,通过具体的代码示例帮助读者更好地理解和掌握指针的使用方法。
45 0
|
7天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
23 4
|
11天前
使用指针访问数组元素
【10月更文挑战第31天】使用指针访问数组元素。
22 2
|
26天前
|
存储 缓存 C语言
【c语言】简单的算术操作符、输入输出函数
本文介绍了C语言中的算术操作符、赋值操作符、单目操作符以及输入输出函数 `printf` 和 `scanf` 的基本用法。算术操作符包括加、减、乘、除和求余,其中除法和求余运算有特殊规则。赋值操作符用于给变量赋值,并支持复合赋值。单目操作符包括自增自减、正负号和强制类型转换。输入输出函数 `printf` 和 `scanf` 用于格式化输入和输出,支持多种占位符和格式控制。通过示例代码详细解释了这些操作符和函数的使用方法。
34 10
|
23天前
|
C语言
【c语言】指针就该这么学(3)
本文介绍了C语言中的函数指针、typedef关键字及函数指针数组的概念与应用。首先讲解了函数指针的创建与使用,接着通过typedef简化复杂类型定义,最后探讨了函数指针数组及其在转移表中的应用,通过实例展示了如何利用这些特性实现更简洁高效的代码。
15 2
|
23天前
|
C语言
如何避免 C 语言中的野指针问题?
在C语言中,野指针是指向未知内存地址的指针,可能引发程序崩溃或数据损坏。避免野指针的方法包括:初始化指针为NULL、使用完毕后将指针置为NULL、检查指针是否为空以及合理管理动态分配的内存。
|
23天前
|
C语言
C语言:哪些情况下会出现野指针
C语言中,野指针是指指向未知地址的指针,通常由以下情况产生:1) 指针被声明但未初始化;2) 指针指向的内存已被释放或重新分配;3) 指针指向局部变量,而该变量已超出作用域。使用野指针可能导致程序崩溃或不可预测的行为。
|
23天前
|
编译器 C语言
【c语言】指针就该这么学(2)
本文详细介绍了指针与数组的关系,包括指针访问数组、一维数组传参、二级指针、指针数组和数组指针等内容。通过具体代码示例,解释了数组名作为首元素地址的用法,以及如何使用指针数组模拟二维数组和传递二维数组。文章还强调了数组指针与指针数组的区别,并通过调试窗口展示了不同类型指针的差异。最后,总结了指针在数组操作中的重要性和应用场景。
17 0
|
1月前
|
C语言
无头链表二级指针方式实现(C语言描述)
本文介绍了如何在C语言中使用二级指针实现无头链表,并提供了创建节点、插入、删除、查找、销毁链表等操作的函数实现,以及一个示例程序来演示这些操作。
22 0