C\C++常见误解和错误、注意问题

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

转载于:https://www.cnblogs.com/ddx-deng/archive/2013/04/16/3755853.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值