c语言指针

『嗨威说』数据结构 - 第三章学习内容小结

删除回忆录丶 提交于 2020-02-08 09:37:43
本文内容: 本章内容小结 完成作业或实践时解决困难的经验分享 参考资料、说明推荐理由及列出相关链接(或书目名称,具体页码) 目前学习过程中存在的困难,待解决或待改进的问题 接下来的目标 一、本章内容小结:(栈与队列)   (1)基本概念: 栈(Stack): 只允许在一端进行插入或删除操作的线性表。首先栈是一种线性表,但是限定这种线性表只能在某一端进行插入和删除操作 栈顶(top): 线性表允许进行插入和删除的那一端。(开口的那一端) 栈底(bottom): 固定的,不允许进行插入和删除的另一端。(封死的那一端) 空栈: 不含任何元素的空表。 栈的两种表示方式: 栈的本质是线性表,那么它就同样有线性表的两种表示形式:顺序栈 和 链式栈(简称“链栈”) 两者的区别:存储的数据元素在物理结构上是否是相互紧挨着的。顺序栈存储元素预先申请连续的存储单元;链栈需要即申请,数据元素不紧挨着。 栈的“上溢”和“下溢”问题: “上溢”:在栈已经存满数据元素的情况下,如果继续向栈内存入数据,栈存储就会出错。(栈满还存会“上溢”) “下溢”:在栈内为空的状态下,如果对栈继续进行取数据的操作,就会出错。(栈空再取会“下溢”) 对于栈的两种表示方式来说,顺序栈两种情况都有可能发生;而链栈由于“随时需要,随时申请空间”的存储结构,不会出现“上溢”的情况。 栈的基本操作:   InitStack(&S)

指针大小为什么与类型无关

情到浓时终转凉″ 提交于 2020-02-08 09:29:59
  指针的大小与硬件有关。   内存中有各种各样的数据,整型、浮点型、字符型等等。这些数据在内存中占据不同大小的储存空间,用sizeof运算符(注:sizeof是种运算符而不是函数,它在编译时发挥作用)进行运算时结果是不同的。然而不同类型的指针在相同系统环境下进行这种运算时结果却是相同的。   众所周知,C语言中的指针描述的是内存中的地址。而内存地址这种东西则是由CPU进行编址的。对于一个4位的CPU来讲,它能同时输出的数据为4位,即0000-1111共2^4 种情况,故这些二进制数字只能对应到16个位置的内存地址,即CPU仅能识别出16个内存地址。即便你的内存再大,它也显示只有16个位置的内存可用。这种原理同样应用于32位和64位的CPU。   32位的CPU能同时呈现32个位的数据,故有2^32 种情况,对应到2^32 个内存位置也就是最大3.85GB大小,因此32位的系统只能支持最大4GB的内存。相比之下,64位的CPU能同时吞吐2^64 位的数据,这显然能够对应到2^64 个内存的地址,而理论上这个大小换算成10进制则是相当大的数,如果对应到内存,此时一个很大的内存。所以我们说64位系统理论支持无穷大内存(这里的无穷大只是一种概念,因为我们不可能用到如此巨大容量的内存)。   综上,因为指针存放的是地址,所以32位内存,共4个字节;64位系统的64位地址共8个字节—

《go语言从入门到进阶实战》_徐波

痞子三分冷 提交于 2020-02-08 02:02:57
摘录 Go语言是Google公司开发的一种静态型、编译型并自带垃圾回收和并发的编程语言。 Go语言不使用虚拟机,只有运行时(runtime)提供垃圾回收和goroutine调度等。 Go语言使用自己的链接器,不依赖任何系统提供的编译器、链接器。因此编译出的可执行文件可以直接运行在几乎所有的操作系统和环境中。 从Go 1.5版本之后,Go语言实现自举,实现了使用Go语言编写Go语言编译器及所有工具链的功能。 Go语言可以利用自己的特性实现并发编译,并发编译的最小元素是包。从Go 1.9版本开始,最小并发编译元素缩小到函数,整体编译速度提高了20%。 Go语言的并发是基于goroutine,goroutine类似于线程,但并非线程。可以将goroutine理解为一种虚拟线程。Go语言运行时会参与调度goroutine,并将goroutine合理地分配到每个CPU中,最大限度地使用CPU性能。 在Go语言中,自增操作符不再是一个操作符,而是一个语句。因此,在Go语言中自增只有一种写法: i++ 如果写成前置自增“++i”,或者赋值后自增“a=i++”都将导致编译错误。 在多个短变量声明和赋值中,至少有一个新声明的变量出现在左值中,即便其他变量名可能是重复声明的,编译器也不会报错。 布尔型无法参与数值运算,也无法与其他类型进行转换。 切片发生越界时,运行时会报出宕机,并打出堆栈

C语言第三周

跟風遠走 提交于 2020-02-08 00:58:54
一. 字符串常量 只要有一对双引号括起来的字符序列就是字符串常量。列如“hello"接”123" 注意: “a"是字符串常量‘a'是字符常量。 二、字符串储存 字符串的结束标志是‘\0’。 列如: char str[6]={'h',‘e','l','l','o','0','\0'}; 三、学习过程中遇到的问题与解决 1、C语言中,为什么字符串可以赋值给字符指针变量? char *p,a='5'; p=&a; //显然是正确的, p="abcd" //但为什么也可以这样赋值? 问:一直理解不了为什么可以将字串常量赋值给字符指针变量,网上查资料学习了一下 答: 双引号做了3件事 : 1.申请了空间(在常量区),存放了字符串 2.在字符串尾加上了'/0' 3.返回地址 这里就是 返回的地址 赋值给了 p 二、char *p = “hello”; 上边的表达式为什么可以,而把p换成数组,然后再赋值就不行了 解释: 字符串常量"hello"出现在一个表达式中时,"hello"表达式使用的值就是这些字符所存储的地址(在常量区),而不是这些字符本身。 所以,可以把字符串赋值给指向字符的指针p,而不能把字符串赋值给一个字符数组。 char a[10] = “hello”; //这样可以,这种情况是c语言初始化所支持的 如果写成char a[10] 然后 a = “hello” 这样就错误了。

[C语言]指针与字符串

随声附和 提交于 2020-02-07 20:49:53
----------------------------------------------------------------------------- // main.c // Created by weichen on 15/2/1. // Copyright (c) 2015年 weichen. All rights reserved. #include <stdio.h> int main(int argc, const char * argv[]) { /*   取地址与获取大小:   1. 运算符sizeof可以给出某个类型或变量在内存中的字节数 2. scanf("%d", &a);里面的&为运算符;&用于获取变量的地址,其操作数必须是变量 3. &不能对没有的东西取地址,如:&(a++),&(++a);取地址符右边必须有一个变量   */ int a = 0; int b = (int)&a; //将a的地址强制类型转换为整型 printf("sizeof(a)=%ld\n", sizeof(a)); //4 printf("sizeof(int)=%ld\n", sizeof(int)); //4 //4. double变量在内存中占据的空间是int变量的两倍 //5. 地址的大小是否与int相同取决于编译器,取决于是32位还是64位架构,并不总是相同

c++ -- 多态(类)

↘锁芯ラ 提交于 2020-02-07 02:12:58
假期 2020.02 .06 学习资源来源于中国MOOC以及c语言中文网 前言 c++之所以是面向对象的是因为该语言既支持类也支持多态,而多态是什么呢? 定义 多态就是同一个操作作用于不同的对象会产生不同的结果。这个操作一般指的是函数的调用等等。 标准定义 是对于通过基类指针调用基类和派生类中都有的同名、同参数表的虚函数的语句,编译时并不确定要执行的是基类还是派生类的虚函数;而当程序运行到该语句时,如果基类指针指向的是一个基类对象,则基类的虚函数被调用,如果基类指针指向的是一个派生类对象,则派生类的虚函数被调用。这种机制就叫作“多态(polymorphism)”。 虚函数 :在成员函数前加 virtual 即可生成虚函数。注意虚函数只能在类的内部定义成员函数时使用,不能在类外部写成员函数时使用,构造函数与静态成员都不能是虚函数。 多态类 :包含虚函数的类称为“多态类”。 如何构成多态 常判断条件是 有继承关系 继承关系中有同名的虚函数,并且是覆盖关系 存在基类的指针,指向派生类的虚函数,或者引用 那么什么时候声明虚函数呢? 成员函数所在的类是否是基类 成员函数在继承后是否会被新定义或者更改,是的话,需要;否则,不需要。 多态应用 举一个指针类型的例子: 注意:多态的语句调用哪个类的成员函数是在运行时才能确定的,编译时不能确定。多态的函数调用语句被称为是“动态联编”

c语言 局部变量做返回值 问题

倖福魔咒の 提交于 2020-02-07 01:10:19
一般的来说,函数是可以返回局部变量的。 局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了。因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果返回的是局部变量的地址(指针)的话,程序运行后会出错。因为函数只是把指针复制后返回了,但是指针指向的内容已经被释放了,这样指针指向的内容就是不可预料的内容,调用就会出错。准确的来说, 函数不能通过返回指向栈内存的指针(注意这里指的是栈,返回指向堆内存的指针是可以的)。 下面以函数返回局部变量的指针举几个典型的例子来说明: 1: [cpp] view plain copy #include <stdio.h> char *returnStr() { char *p= "hello world!" ; return p; } int main() { char *str; str=returnStr(); printf( "%s\n" , str); return 0; } 这个没有任何问题,因为"hello world!"是一个字符串常量,存放在 只读数据段 ,把该字符串常量存放的 只读数据段 的首地址赋值给了指针,所以returnStr函数退出时,该该字符串常量所在内存不会被回收,故能够通过指针顺利无误的访问。 2: [html] view plain copy #include < stdio.h >

C#指针和不安全代码

大憨熊 提交于 2020-02-06 07:23:35
C#指针和不安全代码 一、引言 C#非常擅长对开发人员隐藏大部分的基本内存管理,因为它使用了垃圾回收器和引用。但是有时我们需要对一些内存进行访问那么该怎么办?我们可以用C#中的指针。 C#中也是有指针。指针的操作效率虽然高但是不安全。因为我们可以通过地址的操作来修改内存中的一些数据,而这些内存可能被别的程序使用。这样就有可能造成一定的隐患。 例如: int i =100; int* pt=&i; //将i的地址取出赋值给pt指针。 *(pt+1)=100; //将pt指针的地址加上1后,将此地址的内容赋值为100. 问题就在第三段,因为pt原先是指向i的,i是程序申请的变量空间,所有合法,但是将pt+1的执行的内存不一定是合法的,所以赋值100有可能会出现错误。 也正是因为指针的不安全性,所以在C#中不经常用指针。而是用引用来代替指针。 C#的引用其实就是一个类型安全的指针。 既然指针不安全为什么还要使用它呢? 1、向后兼容性。 许多的外部工具或其他语言编写的Dll中很多都会用到以指针作为参数来传递。为了适应这些要求,有时不得不用到指针。 2、性能 不得不说,由于指针是直接指向内存的,所以它的效率非常的高。所以在对性能、速度要求很高的场合可以考虑用指针。当然如果有更安全的解决方法,就尽量不使用指针。 二、unsafe关键字 使用指针需要注意什么? 因为指针是不安全的

指针

て烟熏妆下的殇ゞ 提交于 2020-02-06 05:21:39
指针(Point) 说到指针,首先要知道什么是指针,那么什么是指针呢? 在计算机中,指针是编程语言中的一个对象,利用地址,它的值是直接指向存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。 那么什么是变量呢? 变量通俗的来说就是能变化数。从本质上说就是在内存当中某一个进程里的一个临时存储区域。其作用是用于存储一些计算当中产生的一些临时性数据。在代码中可以只使用一个变量,也可以使用多个变量,变量中可以存放单词、数值、日期以及属性。 每一个变量空间在创建的时候都会被随机的分配地址,这个地址是个真实的物理内存地址,变量空间中的数据在变化的过程中必须保持是可兼容的,至少是同一类型。否则就会存在错误。 如果直接在代码中用变量的物理地址去访问空间中的数据的话 ,就有可能访问不到。因此为了避免地址的不确定性,引入了变量名这个概念 由变量名-地址表 来保证变量名和变量之间的关系(底层实现)。这样保证其正确性。 我们说的变量空间的地址, 其实就是C语言当中学的指针。 举个例子简单的说明下: 其中*c的含义是返回c 的值作为地址的那个空间的取值。&b的意义是返回当时声明b时开辟的地址。显然可以用赋值语句对内存地址赋值。具体说明如下: #include<stdio.h> void

数组函数指针

时光总嘲笑我的痴心妄想 提交于 2020-02-06 01:11:40
指针函数:int *p(); 指针函数注意不能返回局部变量,只能返回全局变量。 函数指针:int (*p)(); 函数指针的用法如下: 输出结果: 下面是函数指针作为参数: int (*fp)(int,int)它代表的是递两个int类型参数的函数。你看下面calc(add,3,5)就是这么用的 上面这副图里面的 int( select(char op))(int, int) 这个简化简化之后是 int( )(int, int) ,代表一个是函数指针。 select是函数名,该函数有一个char类型的参数,根据上图,这个参数用来进行选择。他有一个返回值,返回值是指针,这个指针就是函数指针,返回整型并且带有两个整型参数的函数指针,函数指针的两个int就是上图中的add和sub函数。 typedef irq_func void(*irq_func)(int irq); irq_func irq_array[332]; //这个代表 C语言允许用户使用 typedef 关键字来定义自己习惯的数据类型名称,eg: typedef int BOOL; BOOL bflag=TRUE; (*irq_func)(int irq) arra[32]; 这就是定义了一个函数指针数组,要把函数的地址存放到一个数组。 上面函数指针定义指针fp作为传递参数传给数组,注意这个数组里面存储的内容也是指针类型。