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