指针数组

C语言指针

夙愿已清 提交于 2020-03-08 20:00:15
10 指针 指针是C语言中广泛使用的一种数据类型。运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构;能很方便地使用数组和字符串;并能象汇编语言一样处理内存地址,从而编出精练而高效的程序。指针极大地丰富了C语言的功能。学习指针是学习C语言中最重要的一环,能否正确理解和使用指针是我们是否掌握C语言的一个标志。同时,指针也是C语言中最为困难的一部分,在学习中除了要正确理解基本概念,还必须要多编程,上机调试。只要作到这些,指针也是不难掌握的。 10.1 地址指针的基本概念 在计算机中,所有的数据都是存放在存储器中的。一般把存储器中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不等,如整型量占2个单元,字符量占1个单元等,在前面已有详细的介绍。为了正确地访问这些内存单元,必须为每个内存单元编上号。根据一个内存单元的编号即可准确地找到该内存单元。内存单元的编号也叫做地址。既然根据内存单元的编号或地址就可以找到所需的内存单元,所以通常也把这个地址称为指针。 内存单元的指针和内存单元的内容是两个不同的概念。 可以用一个通俗的例子来说明它们之间的关系。我们到银行去存取款时,银行工作人员将根据我们的帐号去找我们的存款单, 找到之后在存单上写入存款、取款的金额。在这里,帐号就是存单的指针, 存款数是存单的内容。对于一个内存单元来说,单元的地址即为指针

数组与指针

有些话、适合烂在心里 提交于 2020-03-08 19:49:17
一、指针与数组和指针运算的学习 1.观看视频:1.1.4指针和数组、1.2.1指针运算 2.笔记: 3.代码列表 4.遇到的问题 (1)问题:int i; int *p=&i; void *q=(void*)p; 在1.2.1视频中在讲指针类型转换时表示:“上式没有改变p所指的变量的类型而是让后人用不同的眼光通过p看它指向的变量。”不能理解“后人用不同的眼光通过p看它指向的变量”中的不同的眼光。 解决:百度。void *q=(void*)p;将指针p的内容赋值给空类型指针q,并没有改变i或指针p的类型,但在用q读取 int i时,将以指针q的void类型读取i。 (2)问题:在1.1.4代码: #include<stdio.h> void minmax(int a[],int len,int *max,int *min); int main(void) { int a[]={1,2,3,4,5,6,7,8,9}; int min,max; minmax(a,sizeof(a)/sizeof(a[0]),&min,&max); printf("main sizeof(a)=%lu\n",sizeof(a)); printf("min=%d,max=%d\n",min,max); int *p=&min; printf("*p=%d\n",*p); printf("p[0]=%d\n"

C++指针小结

走远了吗. 提交于 2020-03-08 19:25:19
/*--> */ /*--> */ 一、指针基本概念 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。学习指针必须了解如下四个内容: 1 指针的类型:去掉标识符,指针的类型对于机器而言都是一样的 2 指针指向的类型:去掉标识符和左边的 * 3 指针的值:一个 32 位的数值(一般是内存地址) 4 指针指向的内存区域:指针的值代表指针指向内存区域的首地址,指针指向的类型决定了该内存区域的大小。指针的移位操作和指针指向的类型有关动,指针一次移动一个 sizeof (指针指向的类型)大小。      (1)int*ptr =0;// 指针的类型是 int* 指针所指向的类型是 int ,指针的值为 0 (非法地址)表示指针未指向合法内存。    (2)int**ptr;// 指针的类型是 int** 指针所指向的的类型是 int*    (3)int(*ptr)[3];// 指针的类型是 int(*)[3] 指针所指向的的类型是 int()[3]    (4)int*(*ptr)[4];// 指针的类型是 int*(*)[4] 指针所指向的的类型是 int*()[4] 二、指针相关的运算: 1& :取地址运算符,返回结果是一个指针(地址值都可以转换为指针), &a 的运算结果是一个指针,指针的类型是 a 的类型加个 * ,指针所指向的类型是 a 的类型,指针所指向的地址

C++之指针、引用、数组、堆区栈区

此生再无相见时 提交于 2020-03-07 12:41:28
指针 指针(pointer)是一个值为内存地址的变量(或数据对象) 基本用法 数据类型 * 指针变量名 如 int * ptr_num 注意: Int* p 写法偏向地址 P是一个地址变量 表示一个十六进制地址 Int *p偏向值 *p是一个整型变量 能够表示一个整型值 给指针赋值只能使用&符号 空指针(null pointer)空指针不指向任何对象,在试图使用一个指针之前首先检查是否为空 Int *ptr1 = nullptr; 如果用null需要包含cstdlib Void 指针 一种特殊的指针类型 可以存放任意对象的地址 注意: void 指针存放一个内存地址,地址指向的内容是什么类1、型不能确定 2、Void 类型指针一般用来:拿来和别的指针比较,作为函数的输入和输出;赋值给另一个void 指针 指针小结: 指针同样是一个变量,只不过该变量中存储的是另一个对象的内存地址 如果一个变量存储另一个对象 的地址,则称该变量指向这个对象 指针变量可以赋值 指针的指向在程序执行中可以改变 指针P在执行中某时刻指向变量x在另一时刻可以指向y 注意: 指针命名规则和其他变量命名规则一样 指针不能与现有变量重名 应为指针指定一个地址后才能在语句中使用指针 引用 为对象起了另外一个名字(引用即别名) Int int_value = 1024; //refValue指向int_value

2019春第七周作业

試著忘記壹切 提交于 2020-03-07 09:53:12
这个作业属于哪个课程 C语言程序设计II 这个作业要求在哪里 2019年春季学期第七周作业 我在这个课程的目标是 我希望能够通过学习C语言的知识,编写程序 这个作业在哪个具体方面帮助我实现目标 这个作业让我知道了掌握数组名作为函数参数的用法,理解指针和数组可以实现相同的操作 参考文献 字母大小写转换 , C 结构体 一、本周完成的作业 题目1. 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 输出样例:

数据结构之链表与数组(三)-单向链表上的简单操作

北战南征 提交于 2020-03-07 06:07:18
4 反转单向链表(非递归实现) 思路: 图1 非递归反转链表 如图1所示,假设已经反转了前面的若干节点,且前一段链表的头节点指针为pre,则现在要做的事情是首先保存当前节点cur后面的链表,然后让当前节点cur的指针与后面的节点断开(step1),接下来再将当前节点的next指针指向前一段链表的头节点pre (step2)。处理完当前节点的连接反转后,所有的指针都向后移一位。开始处理下一个节点。 注意点: 1,反转后原来的头节点就变成了反转链表的尾节点,要注意将此结点next指针设为空,否则可能会产生死循环等问题 2,要记得处理链表中没有节点或只有一个的情况。 代码实现: //反转链表(非递归的方式) //输入参数:单链表的头指针 //输出参数:无 //返回值:反转后的单链表指针 SingleList* Reverse_NRecu(SingleList *head) { SingleList *pre,*cur,*lat; //链表中没有节点或只有一个节点 if((head == NULL)||(head->next == NULL)) { return head; } pre = head; cur = head->next; head->next = NULL;//在链表中应该注意边界情况的处理,尾结点一定要为空 lat = cur->next; while(lat !=

C++ STL之vector用法总结

北战南征 提交于 2020-03-07 02:54:34
来源:https://www.cnblogs.com/zhonghuasong/p/5975979.html 介绍 vector是表示可变大小数组的序列容器。 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。 本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小。 vector分配空间策略:vector会分配一些额外的空间以适应可能的增长,因为存储空间比实际需要的存储空间更大。不同的库采用不同的策略权衡空间的使用和重新分配。但是无论如何,重新分配都应该是对数增长的间隔大小,以至于在末尾插入一个元素的时候是在常数时间的复杂度完成的。 因此,vector占用了更多的存储空间,为了获得管理存储空间的能力,并且以一种有效的方式动态增长。 与其它动态序列容器相比(deques, lists and forward_lists), vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效

语言中结构体变量和结构体类型的定义

让人想犯罪 __ 提交于 2020-03-06 13:43:49
1. 结构体类型定义 定义方式1 : Typedef struct LNode { int data; // 数据域 struct LNode *next; // 指针域 } *LinkList; 定义方式2 : struct LNode { int data; // 数据域 struct LNode *next; // 指针域 } ; Typedef struct LNode *LinkList; 以上两个定义方式是等价的,是将*LinkList 定义为struct LNode 类型,即LinkList 被定义为一个类型名。这样就可以用LinkList 来定义说明新的变量了,如: LinkList L ; 即将L 定义为struct LNode 类型的指针变量 2. 结构体类型变量定义 定义方式1 : struct LNode { int data; // 数据域 struct LNode *next; // 指针域 }LnodeA ; 定义方式2 : struct LNode { int data; // 数据域 struct LNode *next; // 指针域 } ; struct LNode LnodeA ; 以上两个定义方式也是等价的,这样就将LnodeA 定义为一个truct LNode 类型的变量,即LnodeA 为一个truct LNode 类型的变量名。

《C++ Primer(第五版)》第六章笔记

旧城冷巷雨未停 提交于 2020-03-06 08:53:59
6.1 函数基础   通过 调用运算符 来执行函数。函数的调用完成两项工作:用实参初始化函数的形参;将控制权转移给被调用函数。   当遇到一条 return 语句时函数结束执行过程。return 也完成两项工作:返回 return 语句中的值;将控制权从被调用函数转移回主调函数。 形参和实参   形参出现在函数定义的地方,实参出现在函数调用的地方。实参是形参的初始值,实参的类型必须与对应的形参类型相匹配。   任意两个形参都不能同名,而且函数最外层作用域中的局部变量也不能使用与函数形参一样的名字(外层局部变量被内部形参隐藏)。 6.1.1 局部对象   对象的 生命周期 是程序执行过程中该对象存在的一段时间。   形参和函数体内部定义的变量统称为 局部变量 。局部变量会 隐藏 在外层作用域中同名的其他所有声明中。   只存在于块执行期间的对象称为 自动对象 。    局部静态对象 在程序的执行路径第一次经过对象定义语句时初始化,并且直到程序终止才被销毁。内置类型的未初始化局部变量产生未定义的值,内置类型的局部静态变量初始化(值初始化)为 0。 6.2 参数传递   形参的类型决定了形参和实参交互的方式。当形参是引用类型时,其对应的实参被 引用传递 或函数被 传引用调用 ;当实参的值被拷贝给形参时,实参被 值传递 或函数被 传值调用 。 6.2.1 传值参数  

LeetCode刻意练习05--最接近的三数之和

て烟熏妆下的殇ゞ 提交于 2020-03-05 23:01:03
最接近的三数之和 题目: 给定 一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。 返回 这三个数的和。假定每组输入只存在唯一答案。 思路: 1.将给定的数组进行排序 2.遍历数组,并且将第一个元素置为nums[i] 3.定义两个指针,左指针为 i+1,右指针为数组最后一个元素的下标。 4.看他们的和,如果他们的和比我们想要的和小,那么左指针右移,如果比我们想要的大,那么右指针左移。如果有更接近的三数之和,那么我们更新sum 优化: 去除重复元素 public int threeSumClosest ( int [ ] nums , int target ) { Arrays . sort ( nums ) ; // int closest_num=10000; int closest_num = nums [ 0 ] + nums [ 1 ] + nums [ 2 ] ; for ( int i = 0 ; i < nums . length - 2 ; i ++ ) { int l = i + 1 , r = nums . length - 1 ; while ( l < r ) { int sum = nums [ l ] + nums [ r ] + nums [ i ] ; if (