指针变量

2019春第七周学习&编辑总结

你说的曾经没有我的故事 提交于 2020-02-13 14:36:26
这个作业属于哪个课程 C语言程序设计二 这个作业要求在哪里 2019春季学期第七周作业 我的课程目标 掌握数组名作为函数参数的用法,理解指针、数组和地址之间的关系,理解指针和数组可以实现相同的操作。。 这个作业在哪个具体方面帮助我实现目标 题目让我学会如何操作运用指针 参考文献 c语言程序设计第3版 基础题 6-2 每个单词的最后一个字母改成大写 (10 分) 函数fun的功能是:将p所指字符串中每个单词的最后一个字母改成大写。(这里的“单词”是指由空格隔开的字符串)。 函数接口定义: void fun( char *p ); 其中 p 是用户传入的参数。函数将 p所指字符串中每个单词的最后一个字母改成大写。 裁判测试程序样例: #include <stdio.h> void fun( char *p ); int main() { char chrstr[64]; int d ; gets(chrstr); d=strlen(chrstr) ; chrstr[d] = ' ' ; chrstr[d+1] = 0 ; fun(chrstr); printf("\nAfter changing: %s\n", chrstr); return 0; } /* 请在这里填写答案 */ 输入样例: my friend is happy 输出样例: After changing: mY

数据结构之链表定义及基本操作实现

对着背影说爱祢 提交于 2020-02-13 14:06:30
  在我上一篇的博客中说过,数据结构的线性结构中有连续存储结构和离散存储结构,这次就写一写学习离散存储结构——链表的小总结。   首先说一下链表的定义:链表是物理存储单元上非连续、非顺序的存储结构,链表的结点间通过指针相连,每个结点只对应有一个前驱结点和一个后继结点,其中,首结点没有前驱结点,尾节点没有后继结点。上述表述共同构成了对链表的定义。   接下来说一下链表的结构:链表由头结点+有效节点构成,其中有效节点由分为首结点、普通节点、尾节点。 头结点:链表中有效结点前面的结点,头结点并不存放实际数据,仅仅是为了方便对链表的操作。 头指针:头结点并没有什么实际的含义,仅仅是为了方便对链表的操作,而头指针,顾名思义,就是指向头结点的指针。我们通过头指针指向的头结点的指针域对链表进行操作。 首结点:链表的第一个有效的结点。 尾结点:链表中最后一个有效的结点,尾结点的指针域为空。   链表已经学习完毕,那么接下来就是要说一下链表的构成——结点。因为链表是一张离散存储的结构,所以就需要通过地址去访问,那么久需要在结点中保存下一个结点的地址。还是用到c语言中的结构体。 1 //定义链表的节点 2 typedef struct Node{ 3 //数据域 4 int data; 5 //指针域 6 struct Node * pNext; 7 }NODE,*PNODE;   结点定义完毕后

数据结构(二) -- 数组和链表

一曲冷凌霜 提交于 2020-02-13 14:04:37
/*--> */ /*--> */ /*--> */ /*--> */ 数据结构(二) -- 数组和链表 数据结构主要可以分为两大模块: 线性结构 非线性结构 本文主要开始讲线性结构。 什么是线性结构 线性结构,顾名思义,就是这些数据所有节点都能被一根线(指针)联系起来的一种结构。 线性结构的存储方式: 连续存储:【数组】 离散存储:【链表】 线性结构的常见应用方式: 栈 队列 专题 :【递归】 数组和链表 本小节学习数组和链表,从底层去了解和实现数组与链表,并分析两者对应的优缺点 数组 数组是最常见的链式存储结构,它是一段连续的内存空间,在内存中我们可以简单表示为下图样式 通过上图我们可以把代码中 int arr[6] = {1,2,3,4,5,6}; 执行的操作从内存中脑补出来,同时我们可以简单分析一下,数组应该有的一些基本使用。如 初始化、 添加新元素、 插入新元素、 删除某个元素、 判断是否为空数组、 是否是满数组、 排序 倒序 查询是否包含某个元素 ······ 本小节就带着你手把手实现一个简单的数组的封装,借此来了解数组的数据结构以及内部的一些基本算法知识。这里就简单的以一个 int 类型的数组来示例,后面学到泛型的时候便可更加好的理解数组的实现。 首先简单分析一下数组中基本的属性,我们有上面的数组内存中的逻辑图可以确定数组有对应的内存空间,有一个内存起始地址

c++之智能指针,异常处理,枚举

拈花ヽ惹草 提交于 2020-02-13 11:15:32
智能指针,文件IO 二、智能指针&动态内存 1. 指针潜在问题 c++ 把内存的控制权对程序员开放,让程序显式的控制内存,这样能够快速的定位到占用的内存,完成释放的工作。但是此举经常会引发一些问题,比如忘记释放内存。由于内存没有得到及时的回收、重复利用,所以在一些c++程序中,常会遇到程序突然退出、占用内存越来越多,最后不得不选择重启来恢复。造成这些现象的原因可以归纳为下面几种情况: 野指针: 内存已经被释放、但是指针仍然指向它。这时内存有可能被系统重新分配给程序使用,从而会导致无法估计的错误 重复释放:程序试图释放已经释放过的内存,或者释放已经被重新分配过的内存,就会导致重复释放错误. 内存泄漏: 不再使用的内存,并没有释放,或者忘记释放,导致内存没有得到回收利用。 忘记调用delete 随着多线程程序的广泛使用,为了避免出现上述问题,c++提供了智能指针,并且c++11对c++98版本的智能指针进行了修改,以应对实际的应用需求。 2. 智能指针 在98版本提供的 auto_ptr 在 c++11得到删除,原因是拷贝是返回左值、不能调用delete[] 等。 c++11标准改用 unique_ptr | shared_ptr | weak_ptr 等指针来自动回收堆中分配的内存。智能指针的用法和原始指针用法一样,只是它多了些释放回收的机制罢了。 智能指针位于 头文件中

C和指针---读书笔记。

烂漫一生 提交于 2020-02-13 09:24:45
C和指针---读书笔记。 1,unsigned int 声明无符号int类型 默认是 singned,即此整数类型包括正负数。也可用于long上。 说明符有 unsigned signed short long 2,枚举 enum jump{cpu = 100, a = 2}; 3,for 循环的执行顺序,,for( expression1; expression2, expression3){statement;} expression1->expression2->statement->expression3->expression2->statement->expression3->.....重复此过程直到不满足条件。 4,C中的 switch(expression){statement},expression只能是整数。 5,goto,,可以跳出多组循环,break不可以。 6,C里面 ,if(i) i 必须是int或float类型,除0外其他数值都为真。 7,所谓短路求值就是 expression1 && expression2,如果expression1为假,则不执行expression2,同理 expression1 || expression2,如果expression1 为真,则表达式为真,不执行expression2

必会,详细剖析11道嵌入式Linux C语言面试题

丶灬走出姿态 提交于 2020-02-13 00:43:15
预处理器(Preprocessor) 1 . 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) 答: #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 我在这想看到几件事情: 1) #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等) 2) 懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。 3) 意识到这个表达式将使一个16位机的整型数溢出, 因此要用到长整型符号L, 告诉编译器这个常数是长整型数。 4) 如果你在表达式中用到UL(表示无符号长整型),那么可能这就给面试者留下了很好的第一印象。记住第一印象很重要。 2 . 写一个"标准"宏MIN ,这个宏输入两个参数并返回较小的一个。 答: #define MIN(A,B) ((A) <= (B) ? (A) : (B)) 这个测试是为下面的目的而设的: 1) 标识#define在宏中应用的基本知识。这是很重要的。因为在 嵌入(inline)操作符 变为标准C的一部分之前,宏是方便产生嵌入代码的唯一方法,对于嵌入式系统来说,为了能达到要求的性能,嵌入代码经常是必须的方法。 2) 懂得在宏中小心地把参数用括号括起来 3) 我也用这个问题开始讨论宏的副作用,例如

为什么返回值为数值时,返回局部变量可以。而返回值为引用时,不能返回局部变量

99封情书 提交于 2020-02-12 21:07:41
最重要的一点: 函数不能返回指向栈内存的指针! https://blog.csdn.net/weixin_40539125/article/details/81367466 为什么? 因为返回的都是值拷贝! 一般的来说,函数是可以返回局部变量的。 局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了。因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果返回的是局部变量的地址(指针)的话,程序运行后会出错。因为函数只是把指针复制后返回了,但是指针指向的内容已经被释放了,这样指针指向的内容就是不可预料的内容,调用就会出错。准确的来说,函数不能通过返回指向栈内存的指针(注意这里指的是栈,返回指向堆内存的指针是可以的)。 我们知道,局部变量的作用域是函数内部,函数一旦执行结束,栈上的局部变量会进行销毁,内存得到释放。因此,此时函数返回的是该局部变量的值拷贝,这是没有问题的。但是如果返回的是局部变量的地址,那么返回的只是该局部变量指针的拷贝,而随着函数运行结束,该拷贝指针所指向的栈内存已经被释放,那么指向一个未知区域就会导致调用的错误。 那如果返回的指针指向的是堆内存,又会怎么样? 这样的使用是没有问题的,在函数内new空间,在函数外delete空间。但是这样并不是一种好的编程风格,尽量在同一个作用域内进行new和delete操作

链表【基础算法题】

Deadly 提交于 2020-02-12 12:50:39
题目一 代码实现 1 package class_03; 2 3 public class Code_07_ReverseList { 4 5 public static class Node { 6 public int value; 7 public Node next; 8 9 public Node(int data) { 10 this.value = data; 11 } 12 } 13 14 public static Node reverseList(Node head) { 15 Node pre = null; 16 Node next = null; 17 while (head != null) { 18 next = head.next; 19 head.next = pre; 20 pre = head; 21 head = next; 22 } 23 return pre; 24 } 25 26 public static class DoubleNode { 27 public int value; 28 public DoubleNode last; 29 public DoubleNode next; 30 31 public DoubleNode(int data) { 32 this.value = data; 33 } 34 } 35 36

【C语言】函数指针扫盲

限于喜欢 提交于 2020-02-12 11:44:33
首先看看函数指针,函数名,以及它们分别与*和&结合后的值 程序清单 #include<stdio.h> void func(void){puts("成功调用");}; int main() { void(*p_func)(void)=func; puts("func是函数名,p_func是指向该函数的指针,那么有:"); printf("func=%p\n*func=%p\n&func=%p\ \np_func=%p\n*p_func=%p\ \n&p_func=%p",func,*func,&func,p_func,\ *p_func,&p_func); //puts("\n接着我们尝试用上述变量调用函数:"); //func(); //(*func)(); //(&func)(); //(p_func)(); //(*p_func)(); return 0; } 执行结果 func是函数名,p_func是指向该函数的指针,那么有: func=004015C0 *func=004015C0 &func=004015C0 p_func=004015C0 *p_func=004015C0 &p_func=0061FECC 可见==func==,== func==,==&func==,==p_func==,== p_func==代表的值都是func()函数的地址 ( &p

C++ 引用总结

丶灬走出姿态 提交于 2020-02-12 07:51:43
一、 概念 引用( reference )是 c++ 对 c 语言的重要扩充;引用就是某一变量或对象的一个别名,对引用的操作与对变量直接操作完全一样 。 二、 语法 格式为: 类型 & 引用变量名 = 已定义过的变量名 例如: int a; int &b = a; //b 即 a 的引用(别名) 三、 特点 一个变量可取多个别名。 引用必须初始化。 引用只能在初始化的时候引用一次 ,不能更改为转而引用其他变量。 操作引用就是操作对象本身,反之亦然 数组没有引用 void 没有引用 四、 用法 基础引用 void TestReference1 () { int a = 1; int & b = a; cout<<"a:address->" <<&a<< endl; cout<<"b:address->" <<&b<< endl; a = 2; b = 3; int & c = b;// 引用一个引用变量,别名的别名 c = 4; } const 引用 void TestReference2 () { int d1 = 4; const int & d2 = d1; d1 = 5;//d1改变,d2的值也会改变。 //d2 = 6;//不能给常量(不能被修改的量)赋值。 const int d3 = 1; const int & d4 = d3; //int&d5 = d3;