c提高第四次作业
1. 简述指针数组和数组指针的区别?
答:
指针数组:是一个数组,每个元素都是指针
数组指针:是一个指针,指向数组的指针
2. 如何定义一个指向 int a[10] 类型的指针变量(数组指针)(使用3种方法)?
答:
1、根据数组类型,定义指针变量,数组指针变量
typedef int ARRARY[10]; //定义了一个名字为ARRARY的数组类型
//等价于typedef int (ARRARY)[10];
ARRARY *p; //数组指针变量
//编译会有警告,但不会出错,因为 a 和 &a的值一样
//就算p = a这样赋值,编译器内部也会自动转换为 p = &a
//不建议这么做
p = a;
//p 指向a数组,指向一维数组的指针
p = &a;
//如何操作数组指针变量 p
int i = 0;
for (i = 0; i < 10; i++)
{
(*p)[i] = i + 1;
//p = &a
//*p -> *(&a) -> a
//(*p)[i] -> a[i]
}
2、直接定义数组指针变量(常用)
//()[]同级,从左往右看
//()有*,它是一个指针,[]代表数组
//指向数组的指针变量,[]中的数字代表指针+1的步长
int(*p)[10];
//p 指向a数组,指向一维数组的指针
p = &a;
3、先定义数组指针类型,再根据类型定义指针变量(常用)
//数组指针类型,加上typedef
typedef int(*Q)[10];
Q p; //根据类型定义变量,p是数组指针变量
p = &a; //p指向数组a
3.
int a[10];
int b[5][10];
int (*p)[10];
p = &a; //为何加 &
p = b; //为何不用加 &
答: a是一维的,必须加& 才表示整一行的首地址
b是二维的,本来就代表整行的首地址
4. int a[3][5] = { 0 };
//a -> a + 0
//a + i
//*(a+i) -> a[i]
//*(a+i)+j -> &a[i][j]
//*(*(a+i)+j ) -> a[i][j]
5. 如何在栈上开辟一个二维数组,如何在堆上开辟一个二维数组?
6. int main(int argc, char *argv[]);
argc, argv分别代表什么?
答:
argc: 传参数的个数(包含可执行程序)
argv:指针数组,指向输入的参数
7. 找到数组中指定字符串的位置
#define NUM(a) (sizeof(a)/sizeof(*a))
char* keywords[] = {
"while",
"case",
"static",
"do"
};
int searcheKeyTable(const char* table[], const int size,
const char* key, int *pos);
答:
#pragma warning(disable:4996)
#include<stdio.h>
#include<stdlib.h>
#include<string.h> #define NUM(a) (sizeof(a)/sizeof(*a))
/*
功能:找到数组中指定字符串的位置
参数:
table:字符串数组(指针数组)首地址
size:数组元素个数
key:匹配字符串,如:“do”
pos:酦醅字符串在数组中的位置,如”do“在keywords中的的位置为4
返回值:
成功:0
失败:非0
*/
int searcheKeyTable(const char* table[], const int size,
const char* key, int *pos) {
if (table == NULL || key == NULL || pos == NULL) {
return -;
} int i = ;
int n = -;//保留的是位置 for (i = ; i < size; i++) {
if (strcmp(table[i], key) == ) {
n = i;
break;
}
}
if (n == -) {//没有匹配字符串 return -;
}
*pos = n + ; return ;
}
int main(void) {
const char* keywords[] = {
"while",
"case",
"static",
"do"
}; int pos = ;
int ret = ; ret = searcheKeyTable(keywords, NUM(keywords), "do", &pos);
if (ret != ) {
printf("searcheKeyTable err:%d\n", ret);
system("pause");
return ret;
}
printf("%s 在keywords位置为: %d\n", "do", pos); printf("\n");
system("pause");
return ;
}
8. 将字符串数组进行排序
int sort(char **array1, int num1,
char (*array2)[30], int num2,
char ***myp3 /*out*/, int *num3);
int main()
{
int ret = 0;
char *p1[] = {"aa", "ccccccc", "bbbbbb"};
char buf2[10][30] = {"111111", "3333333", "222222"};
char **p3 = NULL;
int len1, len2, len3, i = 0;
len1 = sizeof(p1)/sizeof(*p1);
len2 = 3;
ret = sort(p1, len1, buf2, len2, &p3, &len3);
return 0;
}
答:
#pragma warning(disable:4996)
#include<stdio.h>
#include<stdlib.h>
#include<string.h> /*
功能:1、将字符串数组进行排序
2、把二维数组buf2的字符取出来,
3、上面的字符串放在p3,p3是在堆区分配的二维内存
4、对p3中字符串进行排序,通过strcmp()进行排序
参数:
p1:指针数组首地址,char *p1[]={"aa","cccccc","bbbbbb"};
len1:p1元素个数
buf2:二维数组首元素地址,char buf2[][30] = {"111111","333333","222222"};
len2:buf2字符串的行数
p3:二级指针地址,需要在函数内分配二维内存,保存p1和buf2的自渡船,还需要排序
len3:保存p3中字符串个数
返回值:
成功:0
失败:非0
*/
int sort(char **array1, int num1,
char(*array2)[], int num2,
char ***myp3 /*out*/, int *num3) {
if (array1 == NULL || array2 == NULL ||
myp3 == NULL || num3 == NULL) { return -;
}
//打造一个指针数组 char *tmp[num1 + num2]
char **tmp = (char**)malloc(sizeof(char *)*(num1 + num2));
if (tmp == NULL) {
return -;
} int i = ;
int j = ; //char *array1[]={"aa","cccccc","bbbbbb"};
//给每个指针分配内存(指向堆区)
for (i = ; i < num1; i++) {
tmp[i] = (char *)malloc(sizeof(char) * strlen(array1[i])+);
strcpy(tmp[i], array1[i]);
} //i的初始条件从num1开始,重要
//char buf2[][30] = {"111111","333333","222222"}
for (i = num1, j = ; i < num1 + num2; i++, j++) { tmp[i]= (char *)malloc(sizeof(char) * strlen(array2[j]) + );
strcpy(tmp[i], array2[j]);
} //排序
int n = num1 + num2;
char *p = NULL;
for (i = ; i < n - ; i++) {
for (j = i + ; j < n; j++) {
if(strcmp(tmp[i],tmp[j])>){//升序
p = tmp[i];
tmp[i] = tmp[j];
tmp[j] = p; }
}
} //间接赋值是指针存在最大意义
*myp3 = tmp;
*num3 = num1 + num2;
return ;
}
void free_buf(char ***p3, int n) {
if (p3 == NULL) {
return;
}
char **tmp = *p3;
int i = ;
for (i = ; i < n; i++) {
if (tmp[i] != NULL) {
free(tmp[i]);
tmp[i] = NULL;
}
}
if (tmp != NULL) {
free(tmp);
*p3 = NULL;
}
}
int main()
{
int ret = ;
char *p1[] = { "aa", "ccccccc", "bbbbbb" };
char buf2[][] = { "", "", "" };
char **p3 = NULL;
int len1, len2, len3, i = ; len1 = sizeof(p1) / sizeof(*p1);
len2 = ;
printf("排序前\n"); for (i = ; i < len1; i++) {
printf("%s, ", p1[i]);
}
printf("\n");
for (i = ; i < len2; i++) {
printf("%s, ", buf2[i]);
}
printf("\n"); ret = sort(p1, len1, buf2, len2, &p3, &len3);
if (ret != ) {
printf("sort err:%d\n", ret);
system("pause");
return ret;
} printf("排序后\n");
for (i = ; i < len3; i++) {
printf("%s, ", p3[i]);
}
printf("\n"); //释放p3所指向内存
//在函数内部把p3的值赋值为NULL
free_buf(&p3,len3); printf("\n");
system("pause");
return ;
}
c提高第四次作业的更多相关文章
- c提高第三次作业
1. char buf[] = "abcdef"; //下面有啥区别? const char *p = buf; //p指向的内存不能变 char const *p = buf; ...
- c提高第五次作业
重写结构体嵌套一级指针老师和二级指针学生的代码 //结构体类型,每个导师有三个学生 typedef struct Teacher { char *tName; //导师 char **stu; //三 ...
- c提高第四课
1.一维数组的初始化 , , }; //3个元素 ] = { , , }; //a[3], a[4]自动初始化为0 ] = { }; //全部元素初始化为0 memset(c, , sizeof(c) ...
- Java第四次作业——面向对象高级特性(继承和多态)
Java第四次作业--面向对象高级特性(继承和多态) (一)学习总结 1.学习使用思维导图对Java面向对象编程的知识点(封装.继承和多态)进行总结. 2.阅读下面程序,分析是否能编译通过?如果不能, ...
- BUAA OO 2019 第四单元作业总结
目录 第四单元总结 总 UML UML 类图 UML 时序图 UML 状态图 架构设计 第十三次作业 第十四次作业 课程总结 历次作业总结 架构设计 面向对象方法理解 测试方法理解与实践 改进建议 尽 ...
- 耿丹CS16-2班第四次作业汇总
Deadline: 2016-10-13 12:00 作业内容 实验3-1 分别使用while循环.do while循环.for循环求1+2+3+ --+100. 实验3-2 分别使用while循环. ...
- 第四次作业——WORDSEARCH小游戏
“谁想出来的这么缺德的题目啊!!!!”一个声音在我心中回荡 这个题目很早就在课堂上公布了,我和我的小伙伴都惊呆了! 这是个毛?根本无从下手的感觉 总是觉得这个小游戏不是程序能给出答案的,因为我的第一印 ...
- Android提高第十二篇之蓝牙传感应用
请问淘宝上买的单片机蓝牙模块与安卓/android手机通讯的时候需要设置UUID吗? 2013-02-15 09:39 在世张辽 | 浏览 2769 次 想用安卓手机和单片机通过蓝牙模块通讯, ...
- 网络1711班 C语言第四次作业批改总结
网络1711班 C语言第四次作业批改总结 助教有话说(写在前面) 近来,有同学跟老师和助教们反映:博客作业太多太麻烦,而且对编程能力提高似乎没什么帮助?在这里我要谈一谈我的感想. 博客作业的意义? 首 ...
随机推荐
- 【Python3爬虫】斗鱼弹幕爬虫
在网上找到了一份斗鱼弹幕服务器第三方接入协议v1.6.2,有了第三方接口,做起来就容易多了. 一.协议分析 斗鱼后台协议头设计如下: 这里的消息长度是我们发送的数据部分的长度和头部的长度之和,两个消息 ...
- SpringCloud学习中遇到的一些bug
There was a problem with the instance info replicator 错误原因: 该服务尝试将自己作为客服端注册 解决办法: 在application.yml配置 ...
- LINQ之道
提到LINQ首先我们要了解什么是委托:委托是一种引用方法的类型.一旦为委托分配了方法,委托将与该方法具有完全相同的行为.也就是说当你委托给一个人办一件事的时候,他就拥有这个能力去实现这件事,同样委托也 ...
- c#中缓存的使用
缓存的使用: 缓存是分布式系统中的重要组件,主要解决高并发,大数据场景下,热点数据访问的性能问题.提供高性能的数据快速访问,提高数据的读取速度.因为服务器和应用客户端之间存在着流量的瓶颈,所以读取大容 ...
- 简简单单的Vue3(插件开发,路由系统,状态管理)
既然选择了远方,便只顾风雨兼程 __ HANS许 系列:零基础搭建前后端分离项目 系列:零基础搭建前后端分离项目 插件 路由(vue-router) 状态管理模式(Vuex) 那在上篇文章,我们讲了, ...
- FreeMarker js 获取后台设置的request、session
使用Request里的Attribute值最简单的方法就是直接${AttributeName}或者安全一点:${AttributeName!"default Value"} 1.取 ...
- C# 通过KD树进行距离最近点的查找.
本文首先介绍Kd-Tree的构造方法,然后介绍Kd-Tree的搜索流程及代码实现,最后给出本人利用C#语言实现的二维KD树代码.这也是我自己动手实现的第一个树形的数据结构.理解上难免会有偏差,敬请各位 ...
- linux查看硬盘占用情况
Linux命令 : df -hl 使用后文件系统 容量 已用 可用 已用% 挂载点Filesystem Size Used Avail Use% Mounted on/dev/vda1 197G 5. ...
- 结对编程项目总结 by:陈宏伟&刘益
结对编程项目在欢快的国庆假期中也顺利结束了.从最初拿到结对编程项目的思考,再到一步一步实现,中间经历了一个漫长的过程.在我和队友的多次协商下,最终我们还是选择使用基于python来实现这一次结对编程项 ...
- RowKey设计之单调递增行键/时序数据
在一个集群中,一个导入数据的进程锁住不动,所有的client都在等待一个region (因而也就是一个单个节点),过了一会后,变成了下一个region…如果使用了单调递增 或者时序的key便会造成 ...