C语言编程题数组加指针
时间: 2025-03-21 21:14:23 浏览: 28
### C语言数组与指针编程练习
以下是几个经典的C语言数组与指针相关的编程题目或练习:
#### 题目一:筛选奇数除数
编写一个函数 `void fun(int x, int p[], int *n)`,其功能是求出能够整除给定正整数 `x` 的所有奇数,并按照从小到大的顺序存入由参数 `p` 所指向的数组中。最终将这些奇数除数的数量通过形参 `n` 返回。
实现如下:
```c
#include <stdio.h>
void fun(int x, int p[], int *n) {
int count = 0;
for (int i = 1; i <= x; ++i) {
if ((i % 2 != 0) && (x % i == 0)) { // 判断是否为奇数且能被x整除
p[count++] = i; // 存储符合条件的数值
}
}
*n = count; // 将计数值赋值给*n
}
int main() {
int x, result[50], n;
printf("请输入一个正整数x:");
scanf("%d", &x);
fun(x, result, &n);
printf("满足条件的奇数有%d个:", n);
for (int i = 0; i < n; ++i) {
printf("%d ", result[i]);
}
printf("\n");
return 0;
}
```
上述程序实现了对指定范围内奇数因子的查找并存储至数组的功能[^1]。
---
#### 题目二:字符串指针操作
定义字符二维数组以及对应的指针变量完成特定输出任务。
具体代码展示如下所示:
```c
#include<stdio.h>
int main(){
char *c[]={"ENTER","NEW","POINT","FIRST"};
char **cp[]={c+3,c+2,c+1,c};
char ***cpp=cp;
printf("%s\n",**++cpp); /* 输出"NEW" */
printf("%s\n",*--*++cpp+3); /* 输出"INT" */
printf("%s\n",*cpp[-2]+3); /* 输出"TER" */
printf("%s\n",cpp[-1][-1]+1); /* 输出"NTER" */
return 0;
}
```
该段代码展示了多级间接寻址的应用场景及其结果解释[^2]。
---
#### 题目三:指针算术运算中的偏移量计算
下面这段小程序演示了如何利用强制类型转换来理解不同类型的指针对应内存地址单位差异的影响效果。
```c
#include <stdio.h>
int main(void){
int a[4]={1,2,3,4};
int *ptr1=(int*)(&a+1);
int *ptr2=(int*)((char*)&a+1);
printf("%d,%d\n",*(ptr1-1),*ptr2);
return 0;
}
```
这里的关键在于认识到当我们将整个结构体或者数组作为整体看待时,“&a”的含义是什么?它代表的是什么级别的对象呢? 这样才能更好地理解和预测上面那段代码的行为表现形式[^3]。
---
#### 题目四:构建新的平方序列
设计算法解决以下问题——给出一个可能存在负数的非递减排列好的原始数据集合A[n] ,创建另一个同样长度的结果集B[n] 。其中每一个元素都是对应于前者相应位置处绝对值得二次幂值;而且后者也应当保持升序排列关系不变。
解决方案采用双端扫描策略配合额外空间辅助记录过程如下:
```c
#include <stdio.h>
#define MAX_SIZE 100
void generate_square_array(const int src[], int dest[], size_t len) {
int left = 0, right = len - 1, pos = len - 1;
while (left <= right) {
long lsq = (long)(src[left]) * src[left];
long rsq = (long)(src[right]) * src[right];
if (lsq >= rsq) {
dest[pos--] = lsq;
++left;
} else {
dest[pos--] = rsq;
--right;
}
}
}
// 测试部分省略...
```
这种方法有效地解决了由于可能出现的大范围变化而导致难以直接在线修改原有列表状态的问题,同时保证时间复杂度维持在O(n)[^4]。
---
阅读全文
相关推荐


















