C语言指针练习题解析

需积分: 50 39 下载量 113 浏览量 更新于2024-09-18 收藏 44KB DOC 举报
"C语言指针练习" C语言中的指针是一种强大的工具,它允许程序员直接操作内存地址,提高代码效率和灵活性。以下是针对给定题目的一些详细解释: 1. 在这个练习题中,我们首先看到一个数组m及其元素值。要找到`m[m[4]+m[8]]`的值,我们需要先计算`m[4]`和`m[8]`的值,然后将它们相加得到下标。`m[4]`是13,`m[8]`是5,所以`m[4]+m[8]=13+5=18`。由于数组m有10个元素,下标18超出了范围,但我们可以将其视为从0开始的索引,因此`m[18]`实际上等于`m[8]`,即210。接着看`*m+m[9]`,`*m`是m数组的第一个元素94,加上`m[9]`的值13,结果是107。最后,`m[*(m+4)]`,`(m+4)`指向m[4],其值是13,所以我们要找的是`m[13]`,同样根据上述逻辑,这相当于`m[5]`,其值是75。 2. 这里定义了一个二维数组`a[3][4]`和一个指针`q`指向一个具有4个元素的一维数组。`*(q+2)`表示`q`指针向后移动两个单位,即`a[2]`的地址,因此是数组a的第三行的第一个元素的地址。`*(q+1)+2`表示`a[1]`的地址加上2,即指向a[1][2]的地址。`*(*q+2)`意味着解引用`(*q+2)`,也就是取a[2][0]的值,然后再次解引用,得到该元素的值。 3. 对于一维数组`x`,引用元素的形式有`x[i]`,`*(p+i)`,`p[i]`和`(p+x)[i]`。对于二维数组`m[10][6]`,引用元素的形式有`m[i][j]`,`(*(m+i))[j]`,`(*m)[i+j]`(注意这里的`i+j`应理解为`i`行的地址加上`j`列的偏移)。 4. 当定义了一个指针数组`p`,并让每个`p[i]`指向`s[i]`时,可以通过`p[i][j]`,`(*p[i])[j]`,`(**p)[i][j]`来引用`s[i][j]`。 5. 函数`f(y,x)`将`y`与`*x`(即`x`的值)相加,并将结果存储在`x`的位置。在`main`函数中,初始时`x=2`,`y=4`。调用`f(y, &x)`后,`x`的值变为`x+4`,即`6`,`y`的值不变。所以输出是`6 4`。 6. 此题中,将字符串`str`强制转换为整型指针,`*(p+1)`指向第二个字符的ASCII码,即'2'。 7. 定义了指针`p`指向数组`a`的第二个元素。`++(*p)`会递增`p`所指的值(即1),因此`*p`现在是2。`*--p`会先将`p`减1,指向0,然后解引用得到0的值。 8. `*(&a[0][0]+2*2+1)`是数组`a`的第一个元素(值为2)之后的第三个元素,即`a[1][2]`,其值为12。`*(a[1]+2)`指向`a[1]`的第三个元素,也就是`a[1][2]`,值也是12。 9. 选项`c.p1=k;`是错误的,因为试图将一个整数值赋给指针,而不是地址。 10. 数组`a[2][3]`初始化为`{1, 3, 5, 7, 9, 11}`。题目没有提供完整的信息,但根据题意,p1和p2指向同一数组的不同位置,可以推断出涉及指针运算和值的比较。选项`c.p1=k;`同样是错误的,因为它尝试将整数赋给指针。 这些是针对给定的C语言指针练习题的解析,涵盖了许多指针操作的基础知识,如指针解引用、数组和指针的关系、指针算术以及通过指针访问数组元素等。熟悉这些概念对于理解和解决更复杂的C语言编程问题至关重要。