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、总之,定义了指针一定要知道指针指向哪里,不然会出现内存读写问题。

原创粉丝点击