C\C++常见误解和错误、注意问题
来源:互联网 发布:淘宝黑设备 编辑:程序博客网 时间:2024/06/05 10:39
1、字符串
char str[5]="abcde";这里导致赋初值时的越界,出现编译错误,好的解决方法是在赋初值时不指定数组的大小,char str[]="adsfsdfs";
字符串不可赋值,只能赋初值
例如下面的是正确的:
char str[5]="adbc";
下面的是错误的:
char str[5];
str[5]="abcd";
2、函数参数传值
#include "iostream.h"
void cha(int *p);
void main()
{
int a=0;
cout<<"a的值:"<<a<<endl;
cout<<"a的地址:"<<&a<<endl;
cha(&a);
cout<<"a的值:"<<a<<endl;
cout<<"a的地址:"<<&a<<endl;
}
void cha(int *p)
{
*p=9;
p=(int *)90;
}
结果是:
a的值:0
a的地址:0x0012FF7C
a的值:9
a的地址:0x0012FF7C这里不是90
函数的参数作为指针的话,实参&a中是a地址的一个拷贝体,在函数内部改变不了原来的a地址的值,但是能改变指针指向的内容的值!
要想改变指针本身,要用到指针的指针;
#include "iostream.h"
#include "malloc.h"
#include "string.h"
void cha(char **p);
void ch(char *q);
void main()
{
char *str="I am trying!";
char *s=str;
cout<<s<<endl;//输出I am trying!
cout<<str<<endl;//输出I am trying!
cha(&str);
cout<<str<<endl;//输出dddddddd
ch(s);
cout<<s<<endl;//不能输出eeeeeeee
}
void cha(char **p)
{
*p="dddddddd";
}
void ch(char *q)
{
q="eeeeeeee";
}
3、i++与++i区别
eg1: int i=3; int j=3; int a=i++;//a=3,执行组合:a=i;i=i+1; int b=++j;//b=4,执行组合:j+=1;b=j;eg2: int a[4]={1,2,3,4}; int i=0; cout<<a[++i]<<endl;//cout<<a[i++]<<endl;这里的值会有不同 cout<<i<<endl;
4、包含#include "stdio.h"
#include "iostream.h"头文件中,cout输出的执行总是晚于printf,这时与二者的前后无关
5、对于整数求余运算结果:余数的正负性取决于被除数的正负性;
9%(-5)=4而不是-1;-9%(-5)=-4;
6、数组元素个数是定值
int n=9;int a[n];//错误const int n=9;int a[n];//正确,因为n为确定值
数组没有初始化部分,则数组定义时[ ]中的数据不能为空,如int a[];是错误的表示
7、字符串指针和字符数组
相同:都被初始化;不同:字符串指针在定义后能直接赋值,字符数组不能
char *a; a="right"; char b[6]="right"; char c1[6],c2[6],c3[6]; c1[6]={"dddddd"};//wrong c2[6]="ddddd";//wrong c3[6]={'a','a','a','a','a','a'};//wrong
字符数组三种初始化形式:
(1)char c[5]={"hell"};//不能有第5个字符(2)char c[5]="hell";//不能有第5个字符(3)char c[5]={'h','e','l','l','o'};第(3)个中的字符数组不能当字符串使用,比如不能被strcpy,strcat等函数操作
8、函数的声明和定义
声明:返回类型 函数名(参数列表);
定义: 返回类型 函数名(参数列表){ 实现的处理操作}
eg:
void point(int x,int y);//声明 void point(int x,int y)//定义 { cout<<x<<endl; cout<<y<<endl; }
9、函数默认参数规则
a、在函数声明中描述 void point(int x,int y=9);
b、在参数列表中只能从右向左设置
void point(int x,int y=9,int z)//错误;void point(int x,int y,int z=9)//正确
c、默认实参从后向前替换尾部
void point(int x,int y=7,int z=8); //调用时 point();//错误 point(1);//正确 point(1,2,3);//正确,默认参数无效而已 point(1,,3);//错误
10、函数类型变量,typedef定义两种形式
//函数void fun(int a){ cout<<a<<endl;}
//第一种形式
typedef void FUNCTION (int);//定义函数类型FUNCTION,区别于int ,char 类型//声明一个FUNCTION类型的变量指针FUNCTION *f;//赋值f=fun;//调用f(1);
//第二种形式
typedef void (*PFUN) (int);//定义函数类型指针PFUN//声明一个函数指针变量PFUN pf;//赋值pf=fun;//调用pf(1);
11、指针使用两处注意
a、指针指向的字符串不可更新,但是指针的地址可变:
char *pStr="aaa";
pStr[0]='b';//出错:把第一个字符变成b,就会出现提示,引用的内存不能为write,
pStr="bbb";//完全修改指向的地址,则能成功
b、指针使用前要进行赋值或者定义时初始化,并且指向地址不能为NULL,否则会出现读写内存权限问题:
char *pStr=NULL;
cout<<pStr<<endl;//提示对内存00000000处没有读权限
c、总之,定义了指针一定要知道指针指向哪里,不然会出现内存读写问题。
- C\C++常见误解和错误、注意问题
- c语言常见错误与注意点
- C/C++--常见错误
- keil c 常见错误和警告
- [C/C++]常见错误积累
- c,vc常见错误
- C 常见错误
- c编译常见错误
- C语言常见错误
- C语言:常见错误
- 常见C调试错误
- 【C语言】常见错误
- c语言常见错误
- C语言常见错误
- C语言常见错误
- c常见错误汇集
- C/C++常见错误
- c+常见小错误
- java.util.Collections.copy()方法注意点
- 十进制转换为二进制
- 遇上难题
- SUSE Linux 11里Nginx+Resin+JSP+Memcached+MySQL安装配置整合
- 返回阶乘最后非零位
- C\C++常见误解和错误、注意问题
- 中文的处理
- 内建函数
- VC++2012编程演练数据结构《11》哈希表
- 创建群组及共同开发工作区间的权限设置实例
- 为什么visual c++开发基于snmp的网络管理软件是CDP啊?
- smarty 变量
- Struts2数据传输的背后机制:ValueStack(值栈)(转载)
- Smarty知识总结