C语言学习第四课——一些关键字,操作符以及数组与指针的介绍

简介: C语言学习第四课——一些关键字,操作符以及数组与指针的介绍

条件操作符

也叫三目运算符   表达式为exp1?exp2:xep3,用法是表达式1结果若为真,则表达式二计算,否则表达式三计算。

int main()
{
  //求两个数中的较大值
  int a = 3;
  int b = 5;
  int m = 0;
  scanf("%d %d", &a,&b);
  m=(a > b? a:b);//若a大于b,则m=a.否则m=b;
  /*if (a > b)
  {
    b = a;
  }else
  {
    m = b;
  }*/
  printf("%d\n", m);
  return 0;
}

逗号表达式

表达式 为exp1,exp2,exp3......expN,逗号表达式会从左到右依次计算,整个表达式的结果是最后一个表达式的结果。

int main()
{
  int a = 2;
  int b = 3;
  int c = 0;
  int d = (a += 3, b -= a, c = a + b, c - 2);//从前往后算,最后一个为表达式的结果。
  printf("%d", d);//1
  return 0;
}

这里的结果只看c-2,c带入前面的式子计算得到。

[]下标引用操作符,()函数调用操作符

int main()
{
  int arr[10] = { 1,2,3,4,5,6,7,8 };//不完全初始化。剩余元素默认初始化为零
  printf("%d\n", arr[8]);//这里的方块[]是下标引用操作符,引用数组中的元素。
  //函数调用操作符
  int len = strlen("abc");
  printf("%d\n", len);//这里的()就是调用函数时,调用函数操作符
  return 0;
}

这两个就是平常用法,不做作赘述。

常见的关键字

c语言中有许多关键字,他们已经被预设好,无法自己创建。

auto 对于局部变量,自动创建,自动销毁,本质就是一种自动变量,这种变量前面是有auto来修饰的,后来省略不写。比如 int a=4;即为auto int a=4;

   break;用于结束循环,在switch语句中结束循环

   case   在switch case 语句中充当循环条件

   类型都是关键字。short int float long  const 等

   continue跳出本次循环,但不结束循环。

   default   默认的意思

   do 用于do while 循环   for循环

   enum  枚举,自定义类型

   union  联合体

   struct  结构体

   extern  声明外部符号

   goto   可实现分支或循环的语句

   register  寄存器

   return  函数中返回结果

   signed 有符号的   对比 unsigned  无符号型  比如定义年龄(只能是正整数,无符号类型) unsigned int age;

   sizeof  计算l类型内存大小  

    static  静态修饰变量

   typedef  类型定义

   void    "无"类型  

   这里说几个常用的

typedef

 类型重定义 ,给类型重新取外号

typedef unsigned int uint; // 类型的重定义,uint=unsigned int
//一个结构体的重定义
int main()
{
  unsigned int num1 = 10;
  uint num2 = 10;
  return 0;
}
typedef struct Node
{
  int data;
  struct Node* next;
}NODE; 

对于该结构体,被重新定义为NODE ,创建结构体时可直接NODE a,创建一个结构体a。

static  

意思为静态的,静态修饰。作用是:1.修饰局部变量。2.修饰全局变量 3,修饰函数

1.修饰局部变量

void test()
{
  //int a = 5;             //static int a=5
  a++;
  printf("%d", a);
}
int main()
{
  int i = 0;
  while (i < 10)
  {
    test ();
    i++;
  }//调用十次 打印十个6   //加上static 打印6到15
  return 0;
}

static 修饰局部变量 变量进入下一次运算前保留当前的值,改变了它的生命周期。

内存被划分为几个区域,栈区,堆区,静态区。在栈区中的变量,进入作用域创建,出了作用域销毁,是一种临时的状态。

若一个变量被static修饰,他是一个静态变量储存在静态区,静态变量(全局变量就在静态区)创建好后,只有当程序结束时才销毁,出了作用域不会被销毁。而在堆区是动态开辟的空间存储的变量。

故static修饰局部变量,本质上是改变了变量的存储类型,导致他生命周期的变化,但是不影响作用域。

2.修饰全局变量

这里未用static修饰全局变量,可以被外部源文件声明后使用。

c494b15a466847c48e6f2aeab4616e16.png

int main()     
{
  extern int g_val;//声明来自其他源文件的全局变量
  printf("%d", g_val);//报错,无法解析的外部符号
  return 0;
}

177bdf614cdc4a13ba3a02d8db56abae.png

  全局变量是具有外部链接属性,通过链接。在其他源文件里找到该变量

   若加了static修饰后,将外部连接属性变成了内部连接属性,即在其他源文件里看不到该变量,其他源文件链接不到该变量,变量只作用此前的.c文件当中。

   可以理解作用于变小了,本质改变了链接属性。

3.修饰函数

 int ADD(int x, int y)
{
  return x + y;
}
//这里定义的函数拥有者跟全局变量类似的作用域,该函数也可以通过外部声明在别的源文件里使用
int main ()
{
  int a = 10;
  int b = 20;
  int ret = ADD(a, b);
  printf("%d", ret);
  return 0;
}

f4a814e740c9464f8751c46717377502.png

若用static修饰

9c85e668c2c84542ab8f8fb1c3a55059.png

关键字#define

定义常量和宏。

#define M 1000
//#define定义的宏是有参数的
#define ADD(x,y)  ((x)+(y))
//定义求和 宏
int main()
{
  int a = M;
  printf("%d", a);//打印
  int a = 10;
  int b = 20;
  printf("%d", ADD(a, b));
  return 0;
}

宏和函数很相似。但还是存在区别。这里定义宏时,所定义的传参后宏替换括号里的内容  即ADD(x.y)->ADD(a+b),一般书写习惯也不一样,宏定义的一般都是大写,函数不全是大写

指针

1.内存

内存是电脑特别重要的存储器,计算机中程序中的运行都是在内存中,内存空间:如4GB 8GB 16GB等都是挺大的内存空间,如何管理内存?

内存被划分为一个个内存单元,为了找到对应内存单元区域进行编号,一个内存单元大小为一个字节,如32根地址线通过电流产生0 1这样的二进制序列,共有2的32次方,以这种方式生成编号来存储共4GB内存大小。

内存单元的编号如同门牌号,也叫地址,在c语言中,又叫指针。

创建变量需要申请空间,申请对应类型或变量的内存大小,创建指针变量可以存取地址。

int main()
{
  int a = 10;
  //定义指针变量存放地址 
  int* pa = &a;//指针变量:类型 * 变量名称
  *pa;//这里的*是解引用操作,通过地址找到本身,即变为a;
  //* 与&可以想象是两个对立的,取地址与解引用
  //也可以通过改变指针变量改变本身
  *p = a;
  return 0;
}

注意地址的大小是四(32位平台)/八个字节(64位平台)

结构体

用来描述一个拥有多种类型数据复杂的对象,将多种类型的数据结合在一起。如书,有书名,价格,编号,出版社等.

struct book
{
  char name[20];
  int price;
};
int main()
{
  struct book a = { "c语言",55 };
  struct book b = { "数据结构",60 };
    //打印方式
  printf("书名:《%s》\n定价:%d", a.name, a.price);//通过.操作符找到结构体的成员。
  //若为地址
  struct book* c = &b;
  printf("书名:《%s》\n定价:%d",c->name, c->price);//通过->,指针访问结构体成员。
  return 0;
}

struct +结构名称

{

类型1+数据名;

类型2+数据名;

类型3+数据名;

};

相关文章
|
25天前
|
存储 数据可视化 编译器
【C语言】union 关键字详解
联合体(`union`)是一种强大的数据结构,在C语言中具有广泛的应用。通过共享内存位置,联合体可以在不同时间存储不同类型的数据,从而节省内存。在嵌入式系统、硬件编程和协议解析等领域,联合体的使用尤为常见。理解和正确使用联合体可以使代码更加高效和灵活,特别是在内存受限的系统中。
66 3
【C语言】union 关键字详解
|
25天前
|
C语言
【C语言】break 关键字详解
- `break` 关键字用于提前退出循环体或 `switch` 语句的执行。 - 在 `for`、`while` 和 `do-while` 循环中,`break` 可以帮助程序在满足特定条件时退出循环。 - 在 `switch` 语句中,`break` 用于终止 `case` 代码块的执行,避免代码“穿透”到下一个 `case`。 - 注意 `break` 只会退出最内层的循环或 `switch` 语句,确保在嵌套结构中正确使用 `break` 以避免意外的控制流行为。
84 2
|
25天前
|
传感器 安全 编译器
【C语言】enum 关键字详解
`enum`关键字在C语言中提供了一种简洁而高效的方法来定义一组相关的常量。通过使用枚举,可以提高代码的可读性、可维护性,并减少错误的发生。在实际应用中,枚举广泛用于表示状态、命令、错误码等,为开发者提供了更清晰的代码结构和更方便的调试手段。通过合理使用枚举,可以编写出更高质量、更易维护的C语言程序。
105 2
|
25天前
|
缓存 安全 编译器
【C语言】volatile 关键字详解
`volatile` 关键字在 C 语言中用于防止编译器对某些变量进行优化,确保每次访问该变量时都直接从内存中读取最新的值。它主要用于处理硬件寄存器和多线程中的共享变量。然而,`volatile` 不保证操作的原子性和顺序,因此在多线程环境中,仍然需要适当的同步机制来确保线程安全。
60 2
|
25天前
|
存储 编译器 程序员
【C语言】auto 关键字详解
`auto` 关键字用于声明局部变量的自动存储类,其作用主要体现在变量的生命周期上。尽管现代C语言中 `auto` 的使用较少,理解其历史背景和作用对于掌握C语言的存储类及变量管理仍然很重要。局部变量默认即为 `auto` 类型,因此在实际编程中,通常不需要显式声明 `auto`。了解 `auto` 关键字有助于更好地理解C语言的存储类及其在不同场景中的应用。
45 1
|
25天前
|
存储 NoSQL 编译器
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
指针是一个变量,它存储另一个变量的内存地址。换句话说,指针“指向”存储在内存中的某个数据。
77 3
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
|
25天前
|
C语言
【C语言】continue 关键字详解
`continue` 关键字在 C 语言中用于跳过当前循环中的剩余代码,并立即开始下一次迭代。它主要用于控制循环中的流程,使程序在满足特定条件时跳过某些代码。
60 1
【C语言】continue 关键字详解
|
25天前
|
存储 编译器 C语言
【C语言】指针大小知多少 ?一场探寻C语言深处的冒险 !
在C语言中,指针的大小(即指针变量占用的内存大小)是由计算机的体系结构(例如32位还是64位)和编译器决定的。
49 9
|
25天前
|
存储 网络协议 C语言
【C语言】位操作符详解 - 《开心消消乐》
位操作符用于在位级别上进行操作。C语言提供了一组位操作符,允许你直接操作整数类型的二进制表示。这些操作符可以有效地处理标志、掩码、位字段等低级编程任务。
72 8
|
25天前
|
安全 程序员 C语言
【C语言】指针的爱恨纠葛:常量指针vs指向常量的指针
在C语言中,“常量指针”和“指向常量的指针”是两个重要的指针概念。它们在控制指针的行为和数据的可修改性方面发挥着关键作用。理解这两个概念有助于编写更安全、有效的代码。本文将深入探讨这两个概念,包括定义、语法、实际应用、复杂示例、最佳实践以及常见问题。
42 7