C风格字符串和字符数组
字符串常量
以双引号括起来的字符序列是字符串常量,通常编译器会在末尾自动添加一个空字符
//字符常量‘A’表示单个字符A
–”A“是字符串常量表示单个字符A和空字符null
–!!C风格字符串末尾必须有一个’\0’
–char ca1[]={‘1’,’C’,’+’} —–不是C风格字符串因为不是0结尾
–”a” —–不是字符常量,因为是双引号
字符数组
–const char ch[6]=”Daniel”——错误,因为这个C风格字符串包含
–D a n i e l null共七个字符
–char c[5]={‘a’,’b’,’\0’,’c’,’\0’};
–print (“%s”,c);
–这里的输出结果为ab 因为字符串输出遇到\0终止
二维数组
二维数组的声明和初始化
例子
指定其初始化式 int ia[3][4]={ {1,2,3,4}, {5,6,7,8},{ 9,10,11,12 } };
顺序初始化式 int ia[3][4]={ 1,2,3,4,5,6,7,8,9,10,11,12 };
二维数组的省略
第一维可以省略
二维数组的所有元素都赋值的情况下,可以省略
int array[][3]={ 1,2,3,4,5,6};
int array[2][3]={ 1,2,3,4,5,6};
逗号运算符
逗号运算符:多个表达式用逗号分开,其中用逗号分开的表达式的值分别结算,但整个表达的值是最后一个表达式的值
对于语句1来说,最终的值是最后一个表达式的值,也就是d+3 a1=8;
对于语句2来说,最终表达式的值为8,但a2=4;
问题
赋值运算符比逗号运算符的优先级高
因为“,”所以最终表达式的值是最后一个值d+3,但a2的值是a2=++b=4
行优先存储和列优先存储
C++中数组是采用行优先存储
二位数组向一维数组转化
a[x][y]=b[x* 列数+y]
p[i]=* (p+i)
根据上述式子 i= N* x+y 代入
得到 p[i]= * (p+i* N+j)
练习题
一个二维数组 a[1…100] [1…65],行数M 100,列数N 65
p[i]= * (p+i* N+j)
首地址* p为10000 a[56] [22]
注意下标是从1开始 因此
a[56] [22]= 10000+(65* 55+21)* 2=17912
指针运算和操作
指针运算
p指向i,p不能修改i的值,p本身不是const类型,
这里可以修改。p++的时候,指针p跳过i指向下一个内存单元(32位机器为4个字节),此内存单元未定义,所以这里是垃圾值。
算数运算
加法运算
减法运算
两个指针都指向同一个数组中的元素时,才允许从一个指针减去另一个指针
p2-p1 =3
p1-p2 =-3
关系运算
这个代码用于清除一个数组中的全部元素
指针数组和数组指针
指针数组
指针数组是数组
一个有十个指针的数组 int * a[10],每个指针指向一个整型数
数组指针
数组指针是指针
数组指针是一个指向数组的指针
一个指向有10个元素整型数组的指针的定义为 int (* p) [10]
二维数组的数组名是数组指针
代码1
int a[4] [10];
int (* p)[10];
p=a; a的类型是int ( * )p [ 10 ]
p可被替换为a 这里的a是常量不可以进行赋值操作
代码2
int a[ 10 ];
int ( * p) [10]=& a;
//
这里是&a不是a 。 a的类型是int * .& a的类型是 int ( * )[10]
//
int * q=a;
未完结