程序员面试题


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;


未完结



评论
  目录