资讯动态

C++ 基础语法与指针引用详解

发布时间:2026/8/19 22:57:51 来源:尧图企业网站定制
1. 引用与函数副作用在 C 中引用Reference为变量创建了一个别名通过引用传递参数可以实现函数对外部变量的修改这就是函数的副作用。//void Swap(int a, int b)//函数的副作用(会修改外部变量) //{ // int tmp a; // a b; // b tmp; //} // //int main() //{ // int x 10, y 20; // cout x x y y endl; // Swap(x, y); // cout x x y y endl; //}上面的代码展示了通过引用实现交换两个变量的值。函数Swap的参数int a和int b是引用在函数内部对a和b的修改会直接作用到外部的x和y。2. 运算符的三种含义在 C 中运算符根据上下文有三种不同的含义/*// C 运算符与引用 1.按位与运算算二进制 char a 10, b 15; char c a b; // a 0000 1010 // b 0000 1111 // c 0000 1010 2.取地址(取内存地址)得到指针 char *p a (*是修饰符不是解引用修饰p这个指针变量) 3.定义引用给变量起别名 char ra a; */按位与运算对两个操作数的二进制位进行与操作。取地址运算符获取变量的内存地址返回指针。定义引用声明一个变量的别名引用必须初始化且不能改变绑定的对象。3. const 与指针的多种组合const 关键字与指针结合使用可以产生多种不同的语义主要分为四种情况/*int a 10, b 20; int *p a // 普通指针 const int *p1 a // 指向常量的指针 int const *p2 a // 同上* 和 const 挨着指向常量 int *const p3 a // 常量指针指针本身不可变 const int *const p4 a // 双重限制都不可变 *p 100; ✅ 能改内容。 p b ✅ 能改指向。 *p1 100; ❌ error。不能改内容。 p1 b ✅ ok。可以换指向。 *p3 100; ✅ 。指针是常量但指向的数据是普通 int可以改内容。 p3 b ❌ error。指针本身不可变。 *p4 100; ❌ 不能改内容。 p4 b ❌ 不能改指向。 const 在 * 左边 → 管内容内容只读。 const 在 * 右边 → 管指针指针只读。 口诀左定值右定向。 加 const 是收紧权限永远不能去掉 const。 */理解 const 与指针的关系对于编写安全的 C 代码至关重要。记住口诀左定值右定向。4. 字符串格式化与拼接C 中可以使用sprintf函数进行字符串格式化通过移动指针位置实现字符串拼接。//int main() //{ // const char* pt HTTP/1.1; // int a 200; // const char* po OK; // // char str[128] {}; // // HTTP/1.1 200 OK \r\n // int pos sprintf(str, %s %d %s \r\n, pt, a, po); // sprintf(str pos, name: %s \r\n, yhpimg); // printf(%s \n, str); // return 0; //}这段代码演示了如何构建一个 HTTP 响应头。第一个sprintf返回写入的字符数第二个sprintf从str pos位置继续写入避免了覆盖。5. 安全的字符串输入在 C 中有多种方式读取字符串输入需要注意缓冲区溢出问题。//int main() //{ // char str[128] {}; // 0 // //scanf(%s, str); // //printf(%s \n, str); // //cin str; // //都不会以空格作为结尾 // //std::fgets(str, 128, stdin);//方法一 // cin.getline(str, 128, #);//方法二以‘#’作为结尾的标志 // cout str str endl; //}使用cin.getline()可以指定结束符比scanf和普通的cin 更安全。6. 输入函数的安全性C 语言的scanf函数存在缓冲区溢出风险C11 标准引入了scanf_s作为安全版本。//int main() //{ // int a 0; // char str[10]; // scanf_s(%s, str, 10);//scanf函数不安全scanf_s函数不允许越界 // // printf(a %d str %s \n, a, str); // return 0; //}scanf_s要求指定缓冲区大小防止写入越界。在 Linux 环境下通常使用fgets或getline作为替代。7. C 输入输出对比C 的cin/cout与 C 的scanf/printf在使用上有一些区别。//int main() //{ // int a; // char b; // cin a b; // // cin a,b; error // scanf; // cout a a b (int)b endl; // \n // //cout a, b; // printf(%d %c \n, b, b); // b 97 // // 97 a //}C 的流操作符可以连续读取多个变量但语法与scanf的逗号分隔不同。注意字符输出时可能需要类型转换。8. 结构体与初始化C 支持多种初始化方式包括 C11 引入的统一初始化语法。#if 0 struct Student { char s_id[20]; char s_name[20]; char s_sex[10]; int s_age; }; #endif#if 0 int main() { int a 12.25; // double(不安全) int c{ 12.25 };//报错 printf(%d \n, a); // 12; int a 10; // C int b(10); //C 早期 int c{ 10 };//C11 int d int{ 10 };//强转 return 0; } #endifC11 的统一初始化语法{}可以防止窄化转换提高类型安全性。例如int c{12.25};会编译错误而int a 12.25;只会警告。9. 统一初始化的应用统一初始化语法可以用于各种类型的初始化使代码更加一致。#if 0 int main() { int a{ 10 }; // int a 10; int* p{ NULL }; // int *p NULL; int ar[]{ 12,23,34,45 }; // int ar[]{12,23,34}; Student s1{ 2024001,yanggg,man,12 }; //Student s1 { 2024001,yanggg,man,12 }; } #endif与传统初始化方式对比#if 0 int main() { int a 10; int* p NULL; int ar[] { 12,23,34,45 }; Student s1 { 2024001,yanggg,man,12 }; } #endif统一初始化语法更加简洁且能避免一些潜在的类型转换问题。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价