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 #include4 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 #include2 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) 一旦引用被初始化,就不能改变引用的关系,而指针则可以随时改变所指的对象。