博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C/ C++ 常见编程问题
阅读量:6007 次
发布时间:2019-06-20

本文共 2837 字,大约阅读时间需要 9 分钟。

C 中容易忽略的问题

1、在C语言中,浮点型变量分为两类:

     a. 单精度型:类型说明符为float, 在Turbo C 中占4个字节(32位)内存空间,其数值范围为3.4E-38~3.4E+38,可提供7位有效数字。

     b. 双精度型:类型说明符为double, 在Turbo C 中占8个字节(64位)内存空间,其数值范围为1.7E-308~1.7E+308,可提供16位有效数字。

2、C语言中有4种存储类:自动变量、寄存器变量、静态变量、外部变量,分别有auto、register、static、extern 关键字来说明。

     a. 自动变量用关键字auto进行说明,其作用域被限制在该变量出现的那一块内。只要那一块或包含在那一块里的任何块被执行,该变量就存在而且可以被引用。如果程序离开了那一块,该变量就不存在,当不需要它们时,它们不占据任何存储空间。(auto int a;)

     b. 在CPU内部的寄存器中进行操作比在存储器上执行起来要快得多。当把一个变量说明为寄存器变量后,编译程序将尽可能地为该变量分配CPU内部的寄存器作为变量的存储单元,以加快运行速度。(register int a;)

 

3、静态变量的作用域:

    在全局变量之前加上关键字static,全局变量就被定义成一个全局静态变量。全局静态变量的作用域与其他全局变量不同,全局静态变量在声明它的文件之外是不可见的,准确地说是从定义之处开始到文件结尾。

1 Test1.cpp 2  3 #include 
4 void display(); 5 extern int n; 6 void main(){ 7 n=20; 8 printf("%d\n",n); 9 display();10 } 11 12 13 Test2.cpp14 15 #include
16 static int n;17 void display(){18 n++;19 printf("%d\n",n);20 }

文件分别编译通过,但link的时候test1.cpp中的变量n找不到定义,产生错误。一种解决方法是把display函数放到test1.cpp中,另一种方法是把n定义成全局变量,而不是全局静态变量。但全局变量需要初始化,而未经初始化的全局静态变量会被程序自动初始化为0.、

 

3、指针和函数参数

     a. 函数的参数可以是整型、浮点型、字符型等数据类型,以这种方式传递实际参数给形式参数,传递过程是单向的值拷贝过程,形式参数的变化不会影响到实际参数的值,因此只能通过return 语句将函数的结果返回,无法返回多个值。如果一个函数需要有多个输出,可以将指针变量作为函数的参数,它的作用是将一个变量的地址传送给被调用函数的形参。

     b. int a[10];  int *p = &a[10];

     数组名和指针之间有一个区别:指针是变量,p=a 和 p++ 都是有意义的操作,但数组名是常量,不是变量,因此像a=p, a++ 或者 p = &a 之类的表达式都是非法的。

     c. 使用指针时一定要避免指针定义后未赋值就引用。如果在定义时不知道赋什么值,可以用p=NULL赋初值,以避免引起灾难性错误。

 

C++常见编程问题

1、标准C++库中所有组件都是在一个被称为std的命名空间中声明和定义的,在采用标准C++的平台上使用标准C++库中的组件,只要写一个using 指示符:using namespace std; 就可以直接使用标准C++库中的所有成员。如果使用了命名空间std,则在使用#include编译预处理命令包含头文件时,必须去掉头文件的扩展名.h 否则会出错。

 

2、如果一个指针通过+ 、—等操作而改变了指向,那么再释放之前,应确保其回到原来的指向。对于本例,在循环中,每次循环时ptr++,循环结束后,ptr已经不是指向原来的内存空间,在delete时,没有使它回到原来的指向,导致错误。解决办法是在最初是“备份”一份。在释放时,直接释放该指针即可。

1 #include 
2 void main(){ 3 int count; 4 printf("PLease input a number!"); 5 scanf("%d",&count); 6 int * ptr = NULL; 7 if(count>0){ 8 ptr= new int [count]; 9 for(int i=1;i<=count;i++){10 *ptr=i*i;11 printf("%d\t",*ptr);12 ptr++; 13 }14 delete ptr;15 }16 }

如: 修改 int * pbak=ptr;  ... ... ; delete pbak;

 

3、引用是C++中的一个特殊的数据类型描述,它使两个以上的变量名指向同一地址,对其中任一个变量的操作实际上都是对该地址单元进行的。引用运算符为&,其形式为: 数据类型  &引用变量名 = 变量名; 或 数据类型&  引用变量名 = 变量名; 或 数据类型  &  引用变量名 = 变量名;  使用引用时需要注意:

      a. 在一行上声明多个引用型变量(函数)名时,要在每个变量(函数)名前都冠以&符号。 如 int & ref1 = num, & ref2 = num;

      b. 引用被声明时必须进行初始化,除非是用作函数的参数或者返回值。为引用提供的初始值应为变量(包括对象).一旦引用被初始化,就不能改变引用的关系,引用不能用数据类型来初始化。

      c. 不能有空引用,引用必须与合法的存储单元关联。

      d. 由于引用没有地址,所以引用的引用,指向引用的指针或引用的数组都是不合法的,但可以说明对指针变量的引用,因为指针也是变量。

      e. 可以用一个引用初始化另一个引用。例如:int num; int &ref1 = num; int & ref2 = ref1;

      f. 要注意区分引用运算符和地址运算符的区别。

      g. 函数的参数可以是引用。

      h. 函数可以返回引用,函数调用可以作为左值。

      i. 引用与指针有如下区别:i)引用被创建的同时必须被初始化,而指针则可以在任何时候被初始化; ii)不能有空引用,引用必须与合法的存储单元关联,而指针则可以是NULL; iii) 一旦引用被初始化,就不能改变引用的关系,而指针则可以随时改变所指的对象。

转载于:https://www.cnblogs.com/hoojjack/p/5300071.html

你可能感兴趣的文章
J2EE环境配置与工具使用
查看>>
bzoj3684: 大朋友和多叉树(拉格朗日反演+多项式全家桶)
查看>>
C#整数三种强制类型转换int、Convert.ToInt32()、int.Parse()的区别
查看>>
【经典算法】第四回:希尔排序
查看>>
css 禁止选中文本
查看>>
bzoj2165
查看>>
烂泥:【解决】NFS服务器使用showmount –e命令报错
查看>>
烂泥:LVM学习之逻辑卷LV及卷组扩容VG
查看>>
9. ZooKeeper之搭建单机模式。
查看>>
紧急维护,阿里云服务器抢修记
查看>>
数字货币相关
查看>>
payload和formData有什么不同?
查看>>
131016
查看>>
第六次作业
查看>>
python 自动化测试HTTP接口
查看>>
题解——loj6280 数列分块入门4 (分块)
查看>>
Nginx配置文件nginx.conf详解
查看>>
Ubuntu下实现socks代理转http代理
查看>>
使用PL/SQL能查询oracle中数据,在for update 语句中一直卡住
查看>>
05机器学习实战之Logistic 回归scikit-learn实现
查看>>