【C++入门攻略】和【编程常见问题】

news2024/11/27 16:36:11

常见问题

vsstudio快捷键

快速注释组合键 ctrl+k + ctrl+c

取消注释快捷键 ctrl+k + ctrl + u

支持垃圾回收机制

大多数面向对象编程语言具有垃圾回收机制。早期的C++语言不具备垃圾回收机制,这意味着申请的内存资源在使用完成后,需要程序员自己释放。直到C++11标准诞生,提出了智能指针新特性,实现了内存资源的自动管理,使得指针的使用更加灵活,并避免了内存泄漏问题。

iostream和命名空间std的作用?

iostream

std 就是一个命名空间,对象函数很多都是在这里面定义的 用之前调用

三种方式:

1)using namespace std; //引用标准命名空间std

using std::cout;
using std::endl;

std::cout << “123\n”<<std::endl;;

#include<bits/stdc++.h>
#include<iostream> //标准输入/输出头文件iostream
using namespace std; //引用标准命名空间std

int main()
{
    cout << "hello" << endl;
    //cout是预定义的输出流对象,用于输出数据
    //endl表示换行
	return 0;
}

或者如果不使用命名空间std;

using std::cout;
using std::endl;

效果相同

#include<bits/stdc++.h>
#include<iostream>
//using namespace std;
using std::cout;
using std::endl;
int main()
{
    cout << "123\n";
    return 0;
}

cout和endl的功能?

cout是c++语言的输出符号。endl是程序的结束符。

cout<<endl是使程序输出结束(有使输出结果换行的功能)

iostream.h是什么?

一个非标准的输入输出流 .h的头文件是c语言格式的

和iostrem的区别是存不存在在std命名空间中

iostream是什么?

是标准输入输出流,C++规范的,带有名称空间的头文件 包含在std名字空间中

而iostream流里面又包含cin和cout输入输出对象,所以使用cout的时候必须加std::

通过刚才的比较我们了解到iostream是c++的头文件,而iostreamh是C语言格式的头文件,由于C++格式的iostream是规范的带有名字空间的头文件,所以在使用iostream标准库中的cout对象时要加上名字空间标识符std,而c格式的非标准的输入输出流iostream.h则不用

也就是说从C++开始方才真正引入了名字空间这个新概念,那么名字空间的作用究竞是什么呢?

C++里引入名字空间(namespace)的目的是为了避免和减少命名冲突。一旦一个程序写大了,就很难避免重名,特别是多人合作的情况下。过去C中的解决方法只有靠人为的注意,并自加长名学,以避免重名。这样做会使得一些名字看上去没有意义或者难以理解,而程序员在写程序的时候,也受这个问题的限制,不能自由地命名自己使用的变量或者函数。而有了名字空间(namespace)就不存在这些问题了,这就是C++引入namespace这个概念的好处。

举一个形象的例子

有两个学生,一个叫小王,一个叫小李,他们都各自拥有一本相同的语文书,为了区分这两本书,他们就要在书的封皮上写上自己的名字一小王或者小李。同理,我们调用 cout 对象时也要在前边写上 cout 所属的命名空间“std::”,而在代码里加“using namespace std”,就可以不用再加“std::”。但是最好的方法就是不用“using namespace std”,而是用using std::cout;这样可以避免命名重复,因为不同的名字在不同的命名空间内,将它们都释放出来时,若不小心会造成使用错误库函数中的对象的情况。

在这里插入图片描述

重名问题(多个命名空间)

#include<bits/stdc++.h>
#include<iostream>

namespace a
{
    int b = 1;
}
namespace c {
    int b = 2;
}
int main()
{
   /*此处可以不使用using就可直接调用
   using namespace a;
    using namespace c;*/
   //此处无法成功调用,因为无法判断调用的是哪个b
    std::cout << b;
    int b = 9;

    std::cout << b << " " <<a::b<< " " << " " << c::b << " " << std::endl;
}

判断数据类型typeid().name()

cout << typeid(today).name() << endl;

制表符\n\t\r

\n:表示换行操作,光标会移动到下一行(next line)

\t:表示水平制表空行操作,相当于Tab键,不会换行

\r:相当于回车,相当于光标回到本行首位置,不会换行;

函数

函数、输入、传参

在程序中使用函数时,你必须先声明它然后再定义声明的目的是告诉编译器你即将要定义的函数的名字是什么,返回值的类型是什么以及参数是什么而定义则是告诉编译器这个函数的功能是什么。假如我们不声明,那么该函数就不能被其他函数调用通常我们把函数声明叫做函数原型,而把函数定义叫函数实现。

#include<bits/stdc++.h>
using namespace std;
using std::cout;
using std::endl;
void  show()
{
    int lf = 123;
    std::cout << "hello world";
    //return lf;
}
void lf(string name, int age)
{   
    cout << name << age << endl;
}
int count(int a, int b)
{
    return a + b;
}
int main()
{
    //show();
    //std:cout << s << endl;
    lf("lf", 12);
    cout <<count(1,2) << endl;
    
    int a, b;
    cout << "请依次输入两个数字进行求和:"<<endl;
    cin >> a; //用a保存接受用户输入
    cin >> b;
    cout << count(a, b) << endl;
    return 0;
}

函数声明

在程序中使用函数时,你必须先声明它然后再定义声明的目的是告诉编译器你即将要定义的函数的名字是什么,返回值的类型是什么以及参数是什么而定义则是告诉编译器这个函数的功能是什么。假如我们不声明,那么该函数就不能被其他函数调用通常我们把函数声明叫做函数原型,而把函数定义叫函数实现。

先声明再调用就不会出现找不到的情况,只要声明了就会保存在内存空间,直到找到函数的实现

#include<bits/stdc++.h>
using namespace std;

void A();
void B();
void A()
{
    cout << "A\n";
    B();
}
void B()
{
    cout << "B\n";
    A();
}
int main()
{
    A();
    B();
    return 0;
}

局部变量

只能存活在swap函数之内,swap结束之后,swap函数内的局部变量也就被销毁掉了

因此具体的交换只能反映再swap函数之内,而不能反映在swap函数之外

#include<bits/stdc++.h>
using namespace std;

void swap(int, int);
int main()
{
    int x = 3, y = 4;
    cout << " main before"<<x << y << endl;
    swap(x, y);
    cout << " main after" << x << y << endl;
    return 0;
}
void swap(int x, int y)
{
    cout << "swap  before" << x << y << endl;
    int c = x;
    x = y;
    y = c;
    cout << "swap  after" << x << y << endl;
}

全局变量

#include<bits/stdc++.h>
using namespace std;

void swap(int, int);
int x = 3, y = 4;
int main()
{
    int x = 3000, y = 4000;
    cout << " main before"<<x << y << endl;
    swap(x, y);
    cout << " main after" << x << y << endl;
    return 0;
}
void swap(int x, int y)
{
    cout << "swap  before" << x << y << endl;
    int c = x;
    x = y;
    y = c;
    cout << "swap  after" << x << y << endl;
}

数据的类型

字符型

#include<bits/stdc++.h>
using namespace std;

int main()
{
    char ch = 65;
    cout << ch << endl;
    cout << (int)ch;
    for (int i = 32; i < 128; i++)
    {
        cout << (char)i << endl;
    }
    return 0;
}

双字节型

#include<bits/stdc++.h>
#include<locale>
using namespace std;

int main()
{
    //设置所有的为中文类型
    setlocale(LC_ALL,"chs");
    wchar_t wt[] = L"中";
    //wcout代替cout进行输出,因为cout无法输出宽字节型
    wcout << wt;
    return 0;
}

整型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jKIY4dvi-1684055034018)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230513183722133.png)]

#include<bits/stdc++.h>
#include<locale>
using namespace std;

int main()
{
    cout << sizeof(int) << endl;
    cout << sizeof(short) << endl;
    cout << sizeof(long) << endl;

    unsigned int a;
    cout << sizeof(unsigned int) << endl;
    unsigned short b;
    cout << sizeof(unsigned short) << endl;
    unsigned long c;
    cout << sizeof(unsigned long) << endl;
    return 0;
}

数据溢出

从该程序中我们看出整型数据溢出后不会报错,而是象汽车里程表那样,到达最大值后,又从最小值开始因此我们需要时刻注意所定义变量的最大取值计数。范围,一定不要超过这个范围进行赋值。

在这里插入图片描述

在这里插入图片描述

浮点型

使用了头文件iomanip 中的函数 setprecision(),该函数用来设置输出的精度也就是用来设置输出多少位数字,

假如我们将其设置为 15,那么程序就将输出 15 位数字,即使不够,也要凑够15位并输出。

#include<bits/stdc++.h>
#include<iomanip>
using namespace std;


int main()
{
	float a = 1.2342421;
	cout << setprecision(15) << a;
	return 0;
}

枚举型常量

#include<bits/stdc++.h>
#include<iomanip>
using namespace std;


int main()
{
	enum num { zero = 1, one, two = 200,three,four };
	cout << zero << "\t" << one << "\t" << two << "\t" << three << "\t" << four;
	return 0;
}

用enum定义了一个枚举型常量day:它有7个值,每个值对应一个整数从0开始计数,这样星期一(Monday)的值为1,

而星期六(Saturday)的值则为6。

#include<bits/stdc++.h>
#include<iomanip>
using namespace std;


int main()
{
	enum day { Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Satuday };
	day today;//创建一个变量today
	today = Monday;
	cout << today; //输出为1
	if (today == Satuday || today == Sunday) 
	{
		cout << "休息\n";
	}
	else
	{
		cout << "上班\n";
	}
	return 0;
}

数组

逆序题

交换位置,只需要交换一半的位置就可以了

#include<bits/stdc++.h>
#include<iomanip>
//#include <typeinfo>
using namespace std;


int main()
{
	int arr[] = {1,2,3,4,5};
	int temp = 0;
	int length = sizeof(arr) / sizeof(int);
	int end = sizeof(arr) / sizeof(int) - 1;

	for (int i = 0; i < length/2; i++)
	{
		temp = arr[i];
		arr[i] = arr[end];
		arr[end] = temp;
		end--;
	}
	for (int t : arr) {
		cout << t << " ";
	}
	return 0;
}

二维数组题目

#include<bits/stdc++.h>
#include<iomanip>
//#include <typeinfo>
using namespace std;


int main()
{
	//建立二维数组(初始化)
	int scores[3][3];
	string names[3] = { "张三","李四","王五" };
	//赋三科分数
	int a = 0;
	int b = 0;
	int c = 0;
	//计数(下标)
	int n = 0;
	int m = 0;
	//总分
	int sum[3];
	do {
		cout << "请分别输入" << names[n] << "的三科成绩:" << endl;
		cin >> a >> b >> c;
		sum[n] = a + b + c;
		scores[n][m++] = a;
		scores[n][m++] = b;
		scores[n][m] = c;
		m = 0;//置为0
		n++;
		cout << endl;
	} while (n < 3);
	//输出
	for (int i = 0; i < 3; i++) {
		cout << names[i] << "的总成绩为" << sum[i] << endl;
	}


	return 0;
}

面向对象(类)

#include<bits/stdc++.h>
#include<iomanip>
//#include <typeinfo>
using namespace std;
class Human
{
public:
	void walk() { cout << "walk\n"; };
	void speak() { cout << "speak\n"; };
	void run() { cout << "run\n"; };
	void eat() { cout << "eat\n"; };
};


int main()
{
	Human lf;
	lf.walk();
	lf.speak();
	lf.run();
	lf.eat();

	return 0;
}

指针

#include<bits/stdc++.h>
using namespace std;

int main() {
    int i = 1;
    //cout << &i ;

    int a  = 1;
    int* p;
    p = &a;
    cout << &a << " " << p << " " << *p<<" " << a<<endl;

    cout << "--------------------"<<endl;

    return 0;
}
#include<bits/stdc++.h>
using namespace std;

int main() {
    int i = 1;
    int* p = 0;
    cout << &i <<" " << i <<" " << &p<< " " << p;
    return 0;
}

创建堆

C++中使用关键字new创建一个堆并分配内存

#include<bits/stdc++.h>
using namespace std;
typedef unsigned short int ut;

int main() {
    int* p = new int;
    *p = 4;
    cout << *p;
    return 0;
}

请不要再次对该指针进行删除,因为它所指向的内存区域已经被释放,如果再进行释放,将会使程序崩溃。不过,假如我们将该指针赋为0的话,那么删除一个空指针将是安全的

#include<bits/stdc++.h>
using namespace std;
typedef unsigned short int ut;

int main() {
    int* p = new int;
    delete p;
    p = 0;
    delete p;
}
#include<bits/stdc++.h>
using namespace std;
typedef unsigned short int ut;

int main() {
    int* p = new int;
    *p = 3600;
    cout << *p << endl;
    delete p;
    cout << *p << endl;
    p = 0;
    p = new int;
    *p = 8;
    cout << *p << endl;
    delete p;
    return 0;
}

内存泄漏

就会造成内存泄露,这是因为,第 1行定义了一个指针p 并使其指向一块内存空间,第2行又将一块新的内存空间的地址赋给了 P。这样第1行所开的那块内存空间就无法再使用了因为指向它的指针现在已经指向了第2块空间。
指针变量p只能保存一个地址,如对它重新赋值,则表示以前的地址被覆盖,假如该地址的内存空间没有被释放,那么你将无法再次通过指针p 访问它是第2块内存的地址

	int* p = new int;
    delete p;
	p = new int;

this指针

学生在发新课本时一般都要将自己的名字写在课本上,以说明该课本是自己的,避免与其他人的混淆。对象也要在属于自己的每个成员身上写下自己的名字,以证明该成员是自己的成员,而不是其他对象的成员。this 变量帮助对象做到这一点this 变量记录每个对象的内存地址然后通过间接访问运算符->访问该对象的成员。例程如下:

#include<bits/stdc++.h>
using namespace std;

class A
{
public:
    int get() { return i; }
    void set(int x) {
        this->i = x;
        cout << this << endl;
    }
private:
    int i;
};
int main() {
    A a;
    a.set(9);
    cout << a.get() << endl;
    A b;
    b.set(10);
    cout << b.get() << endl;

    return 0;
}

引用

引用的作用

引用在C++中有以下几个主要作用:

  1. 别名: 引用允许我们创建变量的别名,可以通过不同的名称来访问同一变量或对象,从而使代码更加灵活易读。
  2. 函数参数传递: 通过将函数参数声明为引用,函数可以直接修改调用者传递的变量,而无需使用指针或复制数据。这种方式避免了对大型结构体或对象进行值传递时的开销,提高程序效率。
  3. 返回值: 函数可以返回引用类型,以便调用者可以使用相同的名称访问函数返回的变量或对象。这也可以避免大型结构体或对象复制的开销,提高程序效率。

引用并不是值传递,而是通过地址传递。当我们将一个变量作为引用传递给函数时,函数得到的是该变量的地址,而不是变量的副本。因此,对引用所代表的变量进行的任何修改都会影响到原始变量。与之相反,当我们将变量作为值传递给函数时,函数得到的是该变量的一个副本,对副本的修改不会影响到原始变量

引用和指针的区别

引用和指针都可以用于间接访问变量或对象,但它们之间有以下几个区别:

  1. 语法: 引用使用&符号进行声明,而指针使用*符号进行声明。
  2. 空值: 指针可以为NULL或nullptr,表示指向空地址;而引用必须始终指向某个有效的对象。
  3. 初始化: 在声明时,引用必须被初始化为某个对象,而指针则可以在任何时候被初始化或赋值为一个地址。
  4. 可更改性: 一旦引用被初始化为某个对象,就不能再更改它的引用对象;而指针可以在任何时候重新分配到另一个对象。
  5. 所指对象的内存管理: 指针可以进行动态内存分配和释放,因此需要程序员手动管理内存;而引用只是对已经存在的对象的引用,无需手动管理内存。

需要注意的是,引用实际上是通过指针来实现的。当我们创建一个引用时,编译器会为该引用创建一个指针,并将其自动关联到所引用的变量。因此,从内部机制上说,引用和指针是密切相关的。

引用和指针都可以被视为值传递的方式,因为它们传递的是内存地址(即指向实际数据的指针),而不是数据本身。当使用引用或指针时,对该地址上的数据进行更改会影响原始数据。

#include<bits/stdc++.h>
using namespace std;


int main() {
    int a;
    int& ra = a;
    a = 999;
    cout << typeid(&a).name() << endl;
    cout << typeid(&ra).name() << endl;
    cout << &a << endl;
    cout << &ra << endl;

    return 0;
}

C++ STL 教程

在前面的章节中,我们已经学习了 C++ 模板的概念。C++ STL(标准模板库)是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量、链表、队列、栈。

C++ 标准模板库的核心包括以下三个组件:

组件描述
容器(Containers)容器是用来管理某一类对象的集合。C++ 提供了各种不同类型的容器,比如 deque、list、vector、map 等。
算法(Algorithms)算法作用于容器。它们提供了执行各种操作的方式,包括对容器内容执行初始化、排序、搜索和转换等操作。
迭代器(iterators)迭代器用于遍历对象集合的元素。这些集合可能是容器,也可能是容器的子集。

这三个组件都带有丰富的预定义函数,帮助我们通过简单的方式处理复杂的任务。

下面的程序演示了向量容器(一个 C++ 标准的模板),它与数组十分相似,唯一不同的是,向量在需要扩展大小的时候,会自动处理它自己的存储需求:

实例

#include <iostream>
#include <vector>
using namespace std;
 
int main()
{
   // 创建一个向量存储 int
   vector<int> vec; 
   int i;
 
   // 显示 vec 的原始大小
   cout << "vector size = " << vec.size() << endl;
 
   // 推入 5 个值到向量中
   for(i = 0; i < 5; i++){
      vec.push_back(i);
   }
 
   // 显示 vec 扩展后的大小
   cout << "extended vector size = " << vec.size() << endl;
 
   // 访问向量中的 5 个值
   for(i = 0; i < 5; i++){
      cout << "value of vec [" << i << "] = " << vec[i] << endl;
   }
 
   // 使用迭代器 iterator 访问值
   vector<int>::iterator v = vec.begin();
   while( v != vec.end()) {
      cout << "value of v = " << *v << endl;
      v++;
   }
 
   return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:

vector size = 0
extended vector size = 5
value of vec [0] = 0
value of vec [1] = 1
value of vec [2] = 2
value of vec [3] = 3
value of vec [4] = 4
value of v = 0
value of v = 1
value of v = 2
value of v = 3
value of v = 4

关于上面实例中所使用的各种函数,有几点要注意:

  • push_back( ) 成员函数在向量的末尾插入值,如果有必要会扩展向量的大小。
  • size( ) 函数显示向量的大小。
  • begin( ) 函数返回一个指向向量开头的迭代器。
  • end( ) 函数返回一个指向向量末尾的迭代器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/524775.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1066 Root of AVL Tree(51行代码+超详细注释)

分数 25 全屏浏览题目 切换布局 作者 CHEN, Yue 单位 浙江大学 An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child subtrees of any node differ by at most one; if at any time they differ by more than one, rebala…

孙鑫VC++第一章 Windows程序内部运行机制

目录 1.1 API和SDK 1.2 窗口和句柄 1.3 消息和队列 1.4 WinMain 1.4.1 WinMain函数的定义 1.4.2 窗口的创建 1.4.3 消息循环 1.4.4 窗口过程函数 1.1 API和SDK API:Windows操作系统提供给应用程序编程的接口。 SDK&#xff08;软件开发包&#xff09;:用于开发的所有资…

swing列表框_强制存储的DefaultListModel和DefaultComboBoxModel

package com.aynu.layout;import javax.swing.*; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener;public class DefaultListModelTest {JFrame jf new JFrame("测试DefaultListModel");JTextField bookNa…

JVM学习(二)

1. JVM 运行时内存 Java 堆从 GC 的角度还可以细分为: 新生代 ( Eden 区 、 From Survivor 区 和 To Survivor 区 )和 老年 代。 1.1. 新生代 是用来存放新生的对象。一般占据堆的 1/3 空间。由于频繁创建对象&#xff0c;所以新生代会频繁触发 MinorGC 进行垃圾回收。新…

《如何评价北化面向对象江某英之我是传奇》

点进来的都是家人了&#xff0c;来&#xff0c;今天带你们一起速通江某英的面向对象。 首先&#xff0c;我们先看一下江某英的教学安排&#xff0c;所谓知己知彼&#xff0c;百战不殆。 一共是九个章节&#xff0c;但是最后一个总复习没讲&#xff0c;这不是为难我们吗&#x…

【移动端网页布局】Flex 弹性布局案例 ② ( 顶部固定定位搜索栏 | 固定定位盒子居中对齐 | 二倍精灵图设置 | CSS3 中的垂直居中对齐 )

文章目录 一、顶部固定定位搜索栏1、固定定位盒子居中对齐2、设置最大宽度和最小宽度3、使用 Flex 弹性布局管理宽度4、二倍精灵图设置5、CSS3 中的垂直居中对齐 - 行高 内容高度 ( 总高度 - 边框高度 - 内边距高度 ) 二、代码示例1、HTML 标签结构2、CSS 样式3、展示效果 一、…

Pytroch nn.Unfold() 与 nn.Fold()图码详解

文章目录 Unfold()与Fold()的用途nn.Unfold()Unfold()与Fold() 变化模式图解 nn.Fold()单通道 滑动窗口无重叠模拟图片数据&#xff08;b,3,9,9&#xff09;&#xff0c;通道数 C 为3&#xff0c;滑动窗口无重叠。单通道 滑动窗口有重叠。 卷积等价于&#xff1a;Unfold Matri…

国民技术N32G430开发笔记(20)- FreeRTOS的移植

FreeRTOS的移植 1、官网下载FreeRTOSv202212.01&#xff0c;搜索官网下载即可。 2、新建一个FreeRTOSDemo的工程&#xff0c;可以把之前的工程中的Bootloader工程复制一份。 3、打开下载的freertos代码将相应代码移植到我们的工程中。 protable文件夹&#xff0c;因为是gcc环…

ChatGPT国内镜像网站集合

ChatGPT是一个基于人工智能的聊天机器人&#xff0c;它可以与用户进行自然语言交互。ChatGPT使用了最新的自然语言处理技术&#xff0c;包括深度学习和神经网络&#xff0c;以便更好地理解用户的意图和回答用户的问题。 ChatGPT可以回答各种问题&#xff0c;包括但不限于常见问…

RabbitMQ如何避免丢失消息

目录标题 消息丢失1. 生产者生产消息到RabbitMQ Server 消息丢失场景1. 网络问题2. 代码层面&#xff0c;配置层面&#xff0c;考虑不全导致消息丢失解决方案&#xff1a;开启confirm模式 2. 队列本身可能丢失消息1. 消息未完全持久化&#xff0c;当机器重启后&#xff0c;消息…

shell脚本之“sed“命令

文章目录 1.sed编辑器概述2.sed命令常用选项3.sed命令常用操作4.sed命令演示操作部分5.总结 1.sed编辑器概述 sed是一种流编辑器&#xff0c;流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。 sed编辑器可以根据命令来处理数据流中的数据&#xff0c;这些…

C嘎嘎~~[类 下篇 之 日期类的实现]

类 下篇 之 日期类的实现 6.const成员6.1 const成员的引入6.2const成员的概念 7.日期类的实现 6.const成员 6.1 const成员的引入 class Date { public:// 构造函数Date(int year 2023, int month 5, int day 5){_year year;_month month;_day day;}void Print(){cout &…

【STL】vector的使用

目录 前言 默认成员函数 构造函数 拷贝构造 赋值重载 迭代器 正向迭代器 反向迭代器 容量管理 查看容量和大小 扩容 判空 访问数据 下标访问 边界访问 数据修改 尾插尾删 指定位置插入删除 迭代器失效 清空 ​编辑 交换 查找数据 vector可以代替strin…

VOACAP 软件的简单介绍

VOACAP 软件可以预测短波通信中的最高可用频率、最佳传输频率、角度、延迟、反射点高度、信噪比、收发增益等参数&#xff0c;它可以直接输出文本文件&#xff0c;或者以图表输出&#xff0c;同时&#xff0c;它也可以绘制某一参数随时间、距离的变化图表。 该软件的下载安装可…

C语言从入门到精通第18天(指针和函数的联用)

指针和函数的联用 一级指针作为函数的形参二级指针 一级指针作为函数的形参 当函数的形参为数组时&#xff0c;我们定义函数如下&#xff1a; 语法: 数据类型 函数名(数据类型 数组名) 例如 : void func(int a[],int a){ 语句; } 但是在实际使用中我们通常用指针的形式进行…

GEE:如何进行对MOD09GA数据集进行水体/云掩膜并计算NDVI将其导出至云盘?

目录 01 为什么用GEE而不是传统的下载ENVIArcGIS&#xff1f; 02 操作详解 01 为什么用GEE而不是传统的下载ENVIArcGIS&#xff1f; 由于地理空间数据云中缺少2015年10月份的NDVI月合成影像&#xff0c;于是查看了地理空间数据云的NDVI数据集处理的一些介绍如下(地理空间数据…

【Linux内核】信号量semaphore机制

信号量实现方法 信号量机制是一种用于控制并发访问的同步机制&#xff0c;常用于多进程或多线程之间的协调。在Linux内核中&#xff0c;信号量机制是通过struct semaphore结构体来实现的。 每个semaphore结构体包含一个计数器和一个等待队列&#xff0c;它们用于跟踪当前可用…

Linux 并发与竞争

一、并发与竞争 1、并发 Linux 系统是个多任务操作系统&#xff0c;会存在多个任务同时访问同一片内存区域&#xff0c;这些任务可 能会相互覆盖这段内存中的数据&#xff0c;造成内存数据混乱。 多线程并发访问&#xff0c; Linux 是多任务(线程)的系统&#xff0c;所以多线…

命令firewalld和firewall-cmd用法

firewalld命令跟firewall-cmd 1.启动firewalld服务 systemctl start firewalld.service2.关闭firewalld服务 systemctl stop firewalld.service3.重启firewalld服务 systemctl restart firewalld.service4.查看firewalld状态 systemctl status firewalld.service5.开机自启…

接口测试怎么做?全网最详细从接口测试到接口自动化详解,看这篇就够了...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 抛出一个问题&…