习题:
1.根据下面给出的声明和数据,对每个表达式进行求值并写出它的值(如果表达
式未知,注明“未知”)。在对每个表达式进行求值时使用原先给出的值(也
就是说,某个表达式的结果不影响后面的表达式)。假定 ints 数组在内存中
的起始位置是 100,整型值和指针的长度都是 4 个字节。
int ints[20] = {
10, 20, 30, 40, 50, 60, 70, 80, 90, 100,
110, 120, 130, 140, 150, 160, 170, 180, 190, 200};
int *p = ints + 3;
=
1) p
=
2) p[4]
=
3) p + 4
4) *p + 4
=
5) *(p + 4) =
6) p[-2]
=
=
7) &p
=
8) &p[4]
9) &p + 4
=
=
10) &p[-2]
112
80
128
44
80
20
未知
128
未知
104
2. 函数指针是如何引用的?(以 void (*comp)(void)为例进行说明。)
函数指针是否可以强制类型转换?
首先,要定义函数指针变量。例如:void (*comp)(void);
其次,要对函数指针变量赋值。例如:comp=func;(func(x)必须先要有定义);
最后,要用 (*指针变量)(参数表),调用函数。例如:(*comp)(x);(x 必须
先赋值)。
不可以。
3.指针 p、整数 n,问:p + n 与 n + p 的结果是否相同?
不相同
4.如果有定义:
int *a[10];
int (*b)[10];
sizeof(a), sizeof(b)的值分别是多少;
sizeof(a) = 40
sizeof(b) = 4
5.定义以下类型 x:
char *x
1)指向字符的指针
2)指向由 13 个字符类型元素组成的一维数组的指针 char (*x)[13]
3)指向字符指针的指针
4)由 13 个指向字符类型对象的指针组成的一维数组 char *x[13]
char **x
5) 返回值为指向字符类型的指针的函数,该函数没有参数 char *x()
6) 指向返回值为字符类型的函数的指针,该函数没有参数 char (*x)()
7) 返回值为指向一维数组的指针的函数,该一维数组由指向返回字符类型
的函数的指针组成,函数均没有参数。 char *(*x()[])()
8)由 3 个指向函数的指针组成的一维数组,该函数返回指向由 5 个字符组
成的一维数组的指针。 char (*x[5])()[3]
6.假设一个 float 型数组的起始地址是 1100,每个 float 型占 4 个字节的内
存空间,float *p1 和 float *p2 的值分别是 1112 和 1128,表达式 p2 –
p1 等于多少? 16
7.实现库函数 size_t strlen(const char *string);
说明:1)要求提供可编译的 c 源码。
2)要求使用编译测试通过再提交。
3)使用指针方式实现,不要用数组下标。
size_t strlen(const char *string)
{
int length = 0;
if(string == NULL) {
return -1;
}
while(*string++ != ‘\0’) {
length += 1;
}
return length;
}
8. 实现函数:int findchar(char **strings, char value);在字符串列表
strings 中查找特定字符 value,返回匹配到的字符串个数。如:
字符串列表:
“123ASDFG”,
“QWRTYOIA”,
”ZXCVNMG”
查找字符’G’时,返回 2。查找字符 L 时,返回 0。其中字符串列表 strings
是一个指向以 NULL 结尾的指针列表的指针。
int findchar(char **strings, int num, char value)
{
int counts = 0;
if ( strings == NULL
|| num <= 0 )
{
}
return counts;
char *pos = NULL;
for (int i = 0; i < num; i++)
{
pos = strings[i];
while (pos = strchr(pos, value))
{
pos++;
counts++;
}
}
return counts;
}
int main()
{
char* s[] = { "123ASDFG","QWRTYOIA","ZXCVNMG" };
int n = findchar(s, 3, 'G');
printf("%d\n", n);
return 0;
}