1. 大纲
结构体和结构体指针
二级指针
三级指针
指针数组
数组指针
函数指针
复合指针,typedef
gcc 编译器
gdb 调试
Makefile
===============================================================================
作业:
1. 下面每种情况中*ptr和*(ptr+2)的值分别是什么?
a)
int *ptr;
int torf[2][2] = {{12, 14}, {16}};
ptr = torf[0];
*ptr=12,*(ptr+2)=16
b)
int *ptr;
int fort[2][2] = {{12}, {14, 16}};
ptr = fort[0];
*ptr=12,*(ptr+2)=14
2. 假设有如下声明:
float apple[100]; // 一维数组
float apple_tree[10][100]; // 二维数组
float *pf; // 指针
float weight = 2.2; // 浮点变量
int i = 3;
则下列语句中那些是正确的,哪些是错误的?原因是什么?
a. apple[2] = weight;
b. scanf("%f", &apple); scanf("%f", &apple[0]); scanf("%f", apple);
c. apple = weight;
d. printf("%f", apple[3]);
e. apple_tree[4][4] = apple[3];
f. apple_tree[5] = apple;
g. pf = weight;
h. pf = apple; pf = &apple[0];
正确的语句有:a、d、e、h;错误的语句有:b、c、f、g。
3. 实现一个函数 get_submax(),对 N 个元素的整型数组,求该数组的各个子数组中,子数组之和的最大值是多少,
子数组的起始元素地址,以及子数组长度?这三个结果都通过参数返回。
如果有相同最大值的子数组,返回先找到的子数组。
例如数组a[7] = {-2, 5, 3, -6, 4, -8, 6};则子数组之和的最大值是8 (即a[1] + a[2])。
#include <stdio.h>
void get_submax(int *array, int size, int **sub_array, int *sub_size, int *max_sum)
{
int current_sum = 0;//现在的数
int start_index = 0;//
int end_index = 0;
*max_sum = array[0]; // 初始化最大和为第一个元素的值
for (int i = 0; i < size; i++)
{
if (current_sum <= 0)
{
current_sum = array[i];
start_index = i;
}
else
{
current_sum += array[i];
}
if (current_sum > *max_sum)
{
*max_sum = current_sum;
end_index = i;
}
}
*sub_array = &array[start_index];
*sub_size = end_index - start_index + 1;
}
int main()
{
int a[7] = {-2, 5, 3, -6, 4, -8, 6};
int *sub_array;//地址
int sub_size;//长度
int max_sum;//最大值
get_submax(a, 7, &sub_array, &sub_size, &max_sum);
printf("子数组之和的最大值为: %d\n", max_sum);
printf("子数组起始元素地址: %p\n", (void *)sub_array);
printf("子数组长度: %d\n", sub_size);
return 0;
}
4. 编写一个函数,去掉给定字符串中重复的字符。例如给定"google",输出"gole"。
#include <stdio.h>
#include <string.h>
void removeDuplicates(char *str)
{
int len = strlen(str);
if (len < 2)
{
return; // 字符串长度小于等于 1,无需处理
}
int tail = 1; // 维护一个尾指针,指向已处理过的不重复字符的最后一个位置
for (int i = 1; i < len; ++i)
{
int j;
for (j = 0; j < tail; ++j)
{
if (str[i] == str[j])
{
break; // 发现重复字符,跳出内层循环
}
}
if (j == tail)
{
str[tail++] = str[i]; // 如果没有发现重复字符,则将其加入到不重复字符中
}
}
str[tail] = '\0'; // 在末尾添加字符串结束符
}
int main()
{
char str[] = "google";
printf("原始字符串: %s\n", str);
removeDuplicates(str);
printf("去重后的字符串: %s\n", str);
return 0;
}