首页 > 其他分享 >7.2面试错+C语言复习

7.2面试错+C语言复习

时间:2024-07-02 20:52:51浏览次数:19  
标签:const 函数 常量 int C语言 7.2 线程 全局变量 复习

7.2面试错题

设有如下定义:struct sk{int a ; float b ; }data , *p;

若有p=&data ;,则对data中的a域的正确引用是(B )

A.(*p).data.a

B.(*p).a

C.p->data.a

D.p.data.a

1.请简要叙述全局变量和局部变量的区别

*存储位置:全局变量存储在静态存储区,而局部变量存储在栈上。*

*作用范围:全局变量对整个程序可见,而局部变量只对定义它的函数可见。*

*生命周期:全局变量在整个程序执行过程中都存在,只有程序结束时才被销毁,而局部变量的生命周期仅在它所在函数执行期间存在。*

*默认值:全局变量会被自动初始化为 0 或 NULL,而局部变量不会自动初始化。*

2.什么是死锁,什么是锁住?

*死锁(Deadlock)是指在并发系统中,两个或多个进程(线程)互相持有对方所需资源的情况,导致它们无法继续向前执行,进入一种互相等待的状态,从而无法进行下去。*

*死锁出现的四个必要条件被称为死锁条件:*

*1.互斥条件:每个资源在同一时间只能被一个进程(线程)占有。*

*2.占有且等待:进程(线程)至少占有一个资源并等待获取其他进程(线程)占有的资源。*

*3.不可抢占:已分配给进程(线程)的资源不能被强制性地抢占,只能在使用完毕后自愿释放。*

*4.循环等待:存在一个进程(线程)资源的循环链,每个进程(线程)都在等待下一个进程(线程)所占有的资源。*

*锁住(Locking)是指在多线程编程中,为了保护共享资源的一致性,需要使用锁机制来控制对共享资源的访问。锁(或互斥量)是一种同步机制,它允许线程独占地访问被保护的共享资源。当一个线程获得了锁之后,其他线程就必须等待该线程释放锁才能继续操作。锁主要用于避免多个线程同时访问共享资源而引发数据竞争的问题。*

试写一个函数,计算字符串 s中最大连续相同的字符个数。例如,若s 为"aaabbbb",则返回值为4;若s为"abcde",则返回值为1。

int max_same_char( char* s)

#include <stdio.h>

\#include <string.h>

int max_same_char(char* s) {

  int maxCount = 1; // 最大连续相同字符个数,默认为1

  int currentCount = 1; // 当前连续相同字符个数,默认为1

  int length = strlen(s); // 字符串长度

  for (int i = 1; i < length; i++) {

​    if (s[i] == s[i-1]) {

​      currentCount++; // 相同字符,当前个数加1

​      if (currentCount > maxCount) {

​        maxCount = currentCount; // 更新最大个数

​      }

​    } else {

​      currentCount = 1; // 不同字符,重置当前个数为1

​    }

  }

  return maxCount;

}

int main() {

  char s[255];

  fgets(s, sizeof(s), stdin);

  // 移除换行符

  if (strlen(s) > 0 && s[strlen(s)-1] == '\n') {

​    s[strlen(s)-1] = '\0';

  }

  int result = max_same_char(s);

  printf("最大连续相同字符个数:%d\n", result);

  return 0;

}

有一条长阶梯,若每步跨2阶,则最后剩1阶;若每步跨3阶,则最后剩2阶;若每步

跨5阶,则最后剩4阶;若每步跨6阶,则最后剩5阶;只有每次跨7阶,则最后才正

好1阶不剩。写一个函数,计算这样的阶梯最少有多少级台阶。

函数原型:int GetPhaseNum();

#include <stdio.h>


int GetPhaseNum() {

  int x = 1;

  while(1) {

​    if(x % 2 == 1 && x % 3 == 2 && x % 5 == 4 && x % 6 == 5 && x % 7 == 0)

​      break;

​    x++;

  }

  return x;

}

 

int main() {

  printf("%d\n", GetPhaseNum());

  return 0;

}

7.2复习C语言

strcpy与memcpy的区别

strcpy和memcpy主要有以下3方面的区别。
1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等
2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"0"才结束,所以容易溢出(内存写越界)。memcpy则是根据其第3个参数决定复制的长度。
3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy

const关键字的作用

在C语言中,const关键字用于指定一个变量为只读,郎-旦该变量被初始化后,它的值就不能再被修改。const 提供了程序的健壮性,因为它可以帮助程序员捕捉那些无意修改不应改变的数据的错误。
以下是 const 关键字在C语言中的一些主要用途:
常量走义:
使用 const 可以定义常量,这些常量在程序运行期间具有固定的值。const int MAX VALUE= 100:// MAX VALUE 是一个常量,其值不能被修改
指针和常量:
有两种类型的 const 指针:
指向常量的指针:指针指向的数据是常量,不能通过这个指针来修改它所指向的数据const int p=&some int, // int constp= &some int, p 是一个指向 int 常量的指针// p=5,/ 这行代码是错误的,因为p 是常量
常量指针:指针本身是常量,即指针的值(即它所指向的地址)不能被修改,但它所指向的数据可以被修改(除非该数据本身也是常量)。
int x= 10,
int constq=&x/g是一个常量指针,指向X
/g=&some other int, / 这行代码是错误的,因为 q是常量
q=20,/ 这是允许的,因为q指向的数据(x)不是常量
还可以定义指向常量常量的指针(即指针本身是常量,并且它指向的数据也是常量):const int y = 20;const int *constr= &y; //r是一个常量指针,指向一个 int 常量

函数参数:
使用 const 可以确保函数不会修改其参数的值。这既是一种自我文档化的方式,也可以防止函数内部意外地修改其参数
void printArray(const int *arr, size t size)f
for(size ti=0,i< size;i++)fprintf("%d",arri]);// 不能通过 arr 修改数组的内容
printf(""\n");
函数返回值值:尽管 const 通常不直接用于函数返回类型(因为函数返回的是值而不是变量),但当你返回指向静态或全局变量的指针或引用时,使用 const可以确保调用者不会修改这些数据。
类和结构:虽然C语言没有类,但在C结构体中,const可以用于成员变量来指示它们应该被视为只读。这在C++中特别有用,因为C++支持类和对象。
优化:编译器可以将 const 变量放入只读内存段,从而在某些情况下提高程序的性能。
总的来说,const 关键字在C语言中是一个重要的工具,它有助于编写更清晰、更健壮的代码,并允许编译器进行某些优化。

static关键字的作用

1.修饰局部变量。 静态局部变量实际上是特殊的全局变量,它们位于相同的内存区域,内存分为栈区,堆区,静态存储区。静态局部变量和全局变量都位于静态存储区,因此静态局部变量的生命周期与全局变量一样是全局的,随程序启动而生,随程序结束而消亡
2.修饰全局变量。因为全局变量具有外部连接属性,外部任意一个源文件想要使用其他源文件中的全局变量,只需要先使用extem关键字进行声明,然首就可以使用,也就是说某个源文件的全局变量可以在整个项目中被任意的一个源文件使用,所以全局变量的作用域是整个工程。当一个全局变量被tatic所修饰的时候,它就称为了静态全局变量,静态全局变量具有内部连接属性,使得这个静态全局变量只能在自己所在的编译单元中被使用,而不能被其它编译单元所使用,否则会出现链接性错误。(默认情况下,全局变量具有外部符号链接属性,一旦使用static修饰全局变量,变成了静态全局
变量,此时该变量的外部符号链接属性被关闭了,只有内部链接属性,所以该变量仅限于本文件有效)
3.修饰函数。函数也是具有外部连接属性的,编译器每次编译只处理一个编译单元,当某个编译单元需要使用其他编译单元中的函数,只需要声明该巫数(或者包含该函教声明所在的头文件)然后就可以使用,当一个函数被static所修饰的时候,这个函数的外部连接属性就变成了内部车接属件,也就成为了静态函数,使得这个静态函数只能在自己所在的编译单元(本文件)中被使用,而不能被其它编译单元所使用,否则会出现链接性错误,
通常我们在头文件中声明一个函数,然后在源文件中去定义该函数,在定义某函数时需要将某一段代码封装成为另一个函数以达到复用的目的,这段代码所封装成的函数只是为了定义那个感数所使用,不会在其它源文件中使用,所以将其声明为static(鐝蔡C语言中:
修饰局部变量修饰全局变量.修饰函数2
C++中:
修饰类中的方法修饰类中的属性)

内联函数

在C99中
可以使用inine关键字来定义一个内联函数,允许程序员建议编译器将某个函数内联展开。不过要注意的是,这只是一个建议,编译器可能
会忽略它。
例口:
inline int max(int a, int b)f
return (a > b) ? a : b;
在这个例子中,max函数被声明为内联的。当编译器遇到对max函数的调用时,它可能会选择将该函数的代码直接插入到调用点,而不是进行常规的函数调用。
内联函数的作用
内联函数的主要目的是减少函数调用的开销。当函数体很小,且被频繁调用时,使用内联函数可以提音程序的执行效率,因为函教调用通常涉及压栈、跳转和返回等操作,这些操作都会消耗一定的时间。通过将函数体直接插入到调用点,可以消除这些开销。
然而,需要注意的是,内联函数并不总是比非内联函数更快。首先,编译器可能会忽略inine建议,将函数作为常规函数处理。其次,如果函数体很大,内联展开会导致代码膨胀,从而增加指令缓存的未命中率,降低执行效率。此外,内联函数也可能导致链接错误,因为相同的函数体可能被多次插入到不同的源文件中。
因此,在使用内联函数时,需要根据具体情况进行权衡和测试。通常,对于非常小的、且被频繁调用的函数,使用内联函数可能是一个好选择。但对于大型或复杂的函数,最好将其作为常规函数处理
在使用内联函数时,通常将函数定义放在头文件中,并使用关键字inine来声明。

回调函数机制

可调函数的概念;是一个通过函教指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的区数时,我们就说这是回调函数。在C语言中,回调函数(Calback Function)是一种非常有用的机制,它允许一个函数作为参数传递给另一个函数,并在需要时被调用。这种机制在事件处理、异步编程、驱动程序开发等多个领域都有广泛的应用。
回调函数的优缺点
优点:1.提高代码的复用性和灵活性:回调函数可以将一个函数作为参数传递给另一个函数,从而实现模块化编程,提高代码的复用性和灵活性2.解耗合:回调函数可以将不同模块之间的关系解耗,使得代码更易于维护和扩展。3.可以异步执行:回调函数可以在异步操作完成后被执行,这样避免了阻塞线程,提高应用程序的效率。缺点:
回调函数嵌套过多会导致代码难以维护:如果回调函数嵌套层数过多,代码会变得非常复杂,难以维护。
2.回调函数容易造成竟态条件:如果回调函数中有共享资源访问,容易出现竞态条件,导致程序出错。
3.代码可读性差:回调函数的使用可能会破坏代码的结构和可读性,尤其是在处理大量数据时。

标签:const,函数,常量,int,C语言,7.2,线程,全局变量,复习
From: https://www.cnblogs.com/luo-tt/p/18280533

相关文章

  • Python123:找出不是两个数组共有的元素、矩阵运算、方阵循环右移(C语言)
    文章目录1、找出不是两个数组共有的元素2、矩阵运算3、方阵循环右移1、找出不是两个数组共有的元素题目:给定两个整型数组,本题要求找出不是两者共有的元素。输入格式:输入分别在两行中给出两个整型数组,每行先给出正整数N(≤20),随后是N个整数,其间以空格分隔。‪‬‪......
  • 7.2
    今天把数据结构的第一阶段作业写完了学习用时2小时代码用时1小时首先搜资料然后手敲复刻代码遇到的问题是重新移盘之后的visualstudio不能用的重新安装后也会报错需要去注册表删除路径重置。明天准备学习大数据技术。下面是代码7-13中缀表达式转换为后缀表达式并求......
  • 2024.7.2
    党同伐异可以发现,每次只会是\(a_i\)最大或者\(a_i\)最小的人被淘汰,所以留下的肯定是从小到大排序后的一段区间。还可以发现一个单调性,越靠近左边就越不可能票左边,所以可以通过二分求出左右两边各被票了多少。#include<bits/stdc++.h>usingnamespacestd;const......
  • 2024.7.2 集训
    ###数位DP1.记录:1.是否顶上限;2.是否当前填了的都是前导$0$;3.当前位是否是从左往右数第一位。(2和3是两种做法,2是在Query里只调用一次DFS,3是在Query里枚举第一个非$0$位调用多次DFS)。2.记忆化的数组可以不用记所有内容。3.注意DFS返回时要返回res,而不是记......
  • 【C语言入门】C语言入门:探索编程世界的基础概念
    ......
  • PHP8.0正常,PHP7.2,PHP7.3报错Connection failed: SQLSTATE[HY000] [2054] The server
    构建网站API接口的时候,使用了PDO进行数据库连接,原文如下 测试后发现,PHP8.0版本下,可以正常输出,但是PHP7.2和7.3则会报错:Connectionfailed:SQLSTATE[HY000][2054]Theserverrequestedauthenticationmethodunknowntotheclient经查验,发现因为所用的PHP7.2和7.3版本不支......
  • 编译原理期末复习笔记
    本笔记关于编译器的阶段只包含了词法分析、语法分析、语义分析和中间代码生成,如果发现笔记有错误的地方欢迎大家给我指正。文章目录1.介绍1.1什么是编译器(Compiler)1.2编译器vs.解释器(Interpreter)1.3预处理器(Preprocessor)1.4符号表(SymbolTable)1.5其他2.......
  • 计算机二级python复习日记DAY1
    试卷内容及成绩分布选择和编程题选择:选择题期间只允许鼠标左键操作,全部提交完毕后进入操作题模式,键盘才会自动解锁(注意:选择题只能进入一次,还有一定要保证选择题要有20分以上,总分超过60分才能有证书)10分的公共基础题,内容较为庞杂,只需要在做真题的时候积累一下就行30分的pyt......
  • C语言复习
    C语言必问(待更新)1、变量的声明和定义有什么区别为变量分配地址和存储空间的称为定义,不分配地址的称为声明。一个变量可以在多个地方声明,但是只在一个地方定义。加入extern修饰的是变量的声明,说明此变量将在文件以外或在文件后面部分定义。2、C语言中,变量的作用域在C语言中,......
  • #C语言基础 笔记二
    强制转换inta=5;floatb=a/2;//2.000000floatb=(float)a/2;//2.500000#include<stdio.h>intmain(intargc,charconst*argv[]){inta=5;floatb=(float)a/2;printf("%d%f\n",a,b);return0;}分支语句if......