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,全局变量就被定义成一个全局静态变量。全局静态变量的作用域与其他全局变量不同,全局静态变量在声明它的文件之外是不可见的,准确地说是从定义之处开始到文件结尾。

 Test1.cpp

 #include <stdio.h>
void display();
extern int n;
void main(){
n=;
printf("%d\n",n);
display();
} Test2.cpp #include <stdio.h>
static int n;
void display(){
n++;
printf("%d\n",n);
}

文件分别编译通过,但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时,没有使它回到原来的指向,导致错误。解决办法是在最初是“备份”一份。在释放时,直接释放该指针即可。

 #include <stdio.h>
void main(){
int count;
printf("PLease input a number!");
scanf("%d",&count);
int * ptr = NULL;
if(count>){
ptr= new int [count];
for(int i=;i<=count;i++){
*ptr=i*i;
printf("%d\t",*ptr);
ptr++;
}
delete ptr;
}
}

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

C/ C++ 常见编程问题的更多相关文章

  1. (转载)android开发常见编程错误总结

    首页 › 安卓开发 › android开发 android开发常见编程错误总结 泡在网上的日子 / 文 发表于2013-09-07 13:07  第771次阅读 android,异常 0 编辑推荐:稀 ...

  2. C++常见编程--获取当前系统时间

    C++常见编程--获取当前系统时间 文章首发https://www.cppentry.com 本文主要使用time() 及strftime() 函数 C++系统和时间相关的函数基本上都是使用C语言提供 ...

  3. javascript常见编程模式举例

    近期买到手了一本<javascript框架设计>,具体介绍开发js框架所用到的知识.初读一点,乐帝脆弱的理论修养就暴露无遗了,所以专门加强理论修养,重看javascript编程模式的举例. ...

  4. Java编程最差实践(常见编程错误典范)

    转载自  http://macrochen.iteye.com/blog/1393502 每天在写Java程序,其实里面有一些细节大家可能没怎么注意,这不,有人总结了一个我们编程中常见的问题.虽然一般 ...

  5. java面试之常见编程题

    1.编程实现:二分搜索算法 解答: public class SearchTest { /** 被搜索数据的大小 */ private static final int size = 5000000; ...

  6. Spark常见编程问题解决办法及优化

    目录 1.数据倾斜 2.TopN 3.Join优化 预排序的join cross join 考虑Join顺序 4.根据HashMap.DF等数据集进行filter 5.Join去掉重复的列 6.展开N ...

  7. PCL常见编程问题

    1.如何获取pcd文件点云里点的格式,比如是pcl::PointXYZ还是pcl::PointXYZRGB等类型? #include <pcl/io/pcd_io.h> #include ...

  8. android开发常见编程错误总结

    1.设置TextView的文本颜色 1 2 3 TextView tv; ... tv.setTextColor(R.color.white); 其实这样设置的颜色是 R.color.white的资源 ...

  9. c语言常见编程

    //输入一个整数,然后按照原顺序输出相应字符 # import <stdio.h> void main() { void convert (int n); int a; printf (& ...

随机推荐

  1. Sprint第二个冲刺(第十二天)

    一.Sprint 计划会议: 现在商家上传商品的图片的功能已经完成了,正在准备是实现更新商品图片.更新商品价格和商品描述得功能,目前工作进展顺利,进度也慢慢赶上,争取顺利完成目标. 下面是真机测试下的 ...

  2. [Mac]关闭所有打开finder

    p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px 'Helvetica Light'} span.Apple-tab-span {white-sp ...

  3. table中td的空格

    1.css的方式去掉空格 .table{ border-collapse:collapse; border-spacing:0px; }

  4. 在Windows上,迁移VisualSVN server

    最近在搭建自动化测试框架,顺便了解了一下SVN的搭建.对于一般的使用场景,VisualSVN还是挺方便的,而且上手特别快. 由于是第一个demo,后期要迁移到其他服务器上面,所以就熟悉了一下serve ...

  5. 完成一段简单的Python程序,用于实现一个简单的加减乘除计算器功能

    #!/bin/usr/env python#coding=utf-8'''完成一段简单的Python程序,用于实现一个简单的加减乘除计算器功能'''try: a=int(raw_input(" ...

  6. 安全快速修改Mysql数据库名的5种方法

    1. RENAME DATABASE db_name TO new_db_name这个..这个语法在mysql 5.1.7中被添加进来,到了5.1.23又去掉了.据说有可能丢失数据.还是不要用的好.详 ...

  7. bzoj3822: 文学

    Description 巨酱和主席是一对好朋友.他们都很喜欢读书,经常一起阅读相关领域书籍,进行系统的学习.一天主席列出了一份列表,里面共 p 本书,其中不乏<约翰克里斯多夫>,<名 ...

  8. Ajax跨域问题

    为了数据安全,默认情况下ajax请求是不支持跨域访问. 但是可以通过以下方法让ajax接收跨域API地址 第一种:JSONP比较老,较简单的请求可以考虑使用. JS代码 $(function () { ...

  9. Asp.net MVC 之异常处理

    对于Asp.Net MVC 项目中,对于异常情况下,会跳转到自己定义好的页面,这时就用到了MVC中的异常过滤器(Exception Filters) (1)一旦action 方法中出现异常,异常过滤器 ...

  10. 【转载】芯片级拆解51、AVR、MSP430、凌阳61、PIC,5种单片机,多张显微照片

    先秀一张解剖照,放大裁剪,小米1S微距拍摄,800万像素摄像头很给力!今天等待被拆的是5个单片机芯片:(1)凌阳16位单片机SPCE061A ,这是我接触的第一个单片机,最高主频49MHz,32KB的 ...