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+数据名;

};

相关文章
|
2月前
|
传感器 算法 安全
【C语言】两个数组比较详解
比较两个数组在C语言中有多种实现方法,选择合适的方法取决于具体的应用场景和性能要求。从逐元素比较到使用`memcmp`函数,再到指针优化,每种方法都有其优点和适用范围。在嵌入式系统中,考虑性能和资源限制尤为重要。通过合理选择和优化,可以有效提高程序的运行效率和可靠性。
187 6
|
3月前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
268 13
|
3月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
99 5
|
3月前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
3月前
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
|
3月前
|
容器
在使用指针数组进行动态内存分配时,如何避免内存泄漏
在使用指针数组进行动态内存分配时,避免内存泄漏的关键在于确保每个分配的内存块都能被正确释放。具体做法包括:1. 分配后立即检查是否成功;2. 使用完成后及时释放内存;3. 避免重复释放同一内存地址;4. 尽量使用智能指针或容器类管理内存。
|
3月前
|
存储 NoSQL 编译器
C 语言中指针数组与数组指针的辨析与应用
在C语言中,指针数组和数组指针是两个容易混淆但用途不同的概念。指针数组是一个数组,其元素是指针类型;而数组指针是指向数组的指针。两者在声明、使用及内存布局上各有特点,正确理解它们有助于更高效地编程。
|
3月前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
81 4
|
9月前
|
C语言
C语言---指针进阶
C语言---指针进阶
60 0
|
C语言
C语言指针进阶(下)
C语言指针进阶(下)
71 1