指针变量

重新认识C语言的指针(上)

◇◆丶佛笑我妖孽 提交于 2020-01-13 09:10:22
​ 独创性并不是首次观察某种新事物,而是把旧的、很早就是已知的,或者是人人都视而不见的事物当新事物观察,这才证明是有真正的独创头脑 —尼采 本文已经收录至我的GitHub,欢迎大家踊跃star 和 issues。 https://github.com/midou-tech/articles 点关注,不迷路!!! 序言  指针是C语言学习者绕不过的一道坎,也是C语言学习者不得绕过的一道坎。辨别一个人C语言学的好赖就看他对指针的理解怎么样。指针内容也是工作面试经常问到的问题。本文将带你重新认识那个绊倒你的指针,以解大家的心头之惑(恨)。 为什么要学习指针?  有同学就要说了,既然指针这么难,这么不通俗易懂,为什么要学习他呢?其他高级语言都是把这块基本屏蔽掉了,不在让程序员直接操作指针,这里不直接操作指的是不让程序员用指针进行运算和强转而不是彻底没有了。举个java的例子 Object obj= new Object();Object sec= obj;sec = new Object();  如果你去仔细研究他们的行为,就会发现 obj, sec 都只是一个指向对象的东西,可以为空,也可以修改指向,所以它们其实都是指针,只是 Java 的教材里面不在去提这东西而已,具体原因看我后面讲解便知道了。 ​ 继续说为什么学习指针,为什么学习指针就必须要说到指针的优点了。

错题集

僤鯓⒐⒋嵵緔 提交于 2020-01-13 07:24:18
错题集 直接访问就是直接利用变量的地址直接进行访问。 (√) //直接访问就是系统直接将变量所在内存单元的值取出,间接访问是直接访问变量地址。 结构体类型本身不占用内存空间,结构体变量占用内存空间。 (√) // 结构体类型的定义只是告诉编译器该如何表示数据,但是它没有让计算机为其分配空间。结构体类型的定义就是结构体的声明,不管是定义还是申明,这句话都是正确的。只有在结构体变量,声明的时候可以分配。要使用结构体,那么就需要创建变量,也就是结构体变量。 文件指针用于指向文件,文件只有被打开后才有对应的文件指针。 (√) //文件指针是指向一个文件的指针,确切的将是指向用文件这个结构体所定义的对象的起始地址。 变量被定义后 , 它的作用域和寿命就被确定了 , 并且不可改变。 (√) //作用域就是一个变量可以被引用的范围,生命周期就是这个变量可以被引用的时间段。每个作用域都有相对应的生命周期,变量被定义后,作用域和生命周期就被确定了 , 并且不可改变。 两指针变量相减所得之差是两个指针所指数组元素之间相差的元素个数。(√) //实际上是两个指针值(地址)相减之差再除以该数组元素的长度(字节数)。 在c语言中,不允许有常量的数据类型是(B ) A.整型 B.结构型 C.字符型 D.字符串 //结构型是基本数据类型的组合,没有单独的常量。 文件指针和位置指针都是随着文件的读写操作在不断改变

2.12一级指针的值修改

ぃ、小莉子 提交于 2020-01-13 05:19:09
【注:自己从老师讲解出理解的,不对的地方望指正】 【注:本程序验证是使用vs2013版】 #include <stdio.h> #include <stdlib.h> #include <string.h> #pragma warning(disable:4996) int main(void){ char buf[] = "abcde"; /*1、修改指针的值(改变指针的指向)*/ char *a = NULL; printf(" a:%d\n", a); a = &buf[0]; //改变指针变量(就是改变指针的指向),a指向了数组buf的首地址 printf(" a(1):%d\n", a); printf("*a(1):%c\n", *a);/这里应该是a[0]   a = a + 1; //改变指针变量(就是改变指针的指向) //此处等价于 p = &buf[0+1] printf(" a(2):%d\n", a); printf("*a(2):%c\n", *a); //指针的一个长度时4,字符串的一个长度也是4, p -> a p+1 -> b /*2、不断改变指针的指向*/ char *b = NULL; b = &buf[0]; //等价于 b = buf ; for (int i = 0; i < strlen(buf); i++){ b++; //等价于 b

第六周编程总结

梦想的初衷 提交于 2020-01-13 03:05:44
一、作业 这个作业属于哪个课程 C语言程序设计ll 这个作业要求在哪里 ( https://edu.cnblogs.com/campus/zswxy/software-engineering-class2-2018/homework/2888 ) 我在这个课程的目标是 理解变量、内存单元和地址之间的关系,掌握指针变量的基本运算 这个作业在哪个具体方面帮助我实现目标 让我大概了解了指针的定义及用法 参考文献 ( https://jingyan.baidu.com/article/20095761754006cb0721b4bb.html ) 基础题 1、求两数平方根之和 函数fun的功能是:求两数平方根之和,作为函数值返回。例如:输入12和20,输出结果是:y = 7.936238。 函数接口定义: double fun (double a, double b); 其中 a和 b是用户传入的参数。函数求 a指针和b 指针所指的两个数的平方根之和,并返回和。 裁判测试程序样例: #include<stdio.h> #include <math.h> double fun (double *a, double *b); int main ( ) { double a, b, y; scanf ("%lf%lf", &a, &b ); y=fun(&a, &b); printf ("y=%

Go 基础语法

只谈情不闲聊 提交于 2020-01-13 03:05:02
转自:http://studygolang.com/topics/548 例子Packages.go: package main import ( "fmt" "math/rand" ) func add(x int, y int) int { return x + y } func main() { fmt.Println("My favorite number is", rand.Intn(10)) fmt.Println(add(42, 13)) } 包:每个 Go 程序都是由包(package)组成的,程序运行的入口是包 main 。 导入:这个代码用圆括号组合了导入,这是“打包”导入语句。同样可以编写多个导入语句,例如: import "fmt" import "math" 这个程序使用并导入了包 "fmt" 和" math/rand" 。包名与导入路径的最后一个目录一致。例如,如果你导入了" math/rand" ,那么你就可以在程序里面直接写rand.Intn(10),但如果你导入的是" math" ,那么你就得写math.rand.Intn(10)。 函数:函数可以没有参数或接受多个参数。在这个例子中, add 接受两个 int 类型的参数,注意类型在变量名之后。有没有觉得很奇怪呢,下面就详细解释一下go这样做的原因。 看一个c的例子: int (*fp)(int

typedef 与 define

≡放荡痞女 提交于 2020-01-13 03:02:54
一、typedef的用法 在C/C++ 语言 中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像: typedef int INT; typedef int ARRAY[10]; typedef (int*) pINT; typedef可以 增强 程序的可读性,以及标识符的灵活性,但它也有“非直观性”等缺点。 二、#define的用法 #define为一宏定义语句,通常用它来定义常量(包括无参量与带参量),以及用来实现那些“表面似和善、背后一长串”的宏,它本身并不在编 译过程中进行,而是在这之前(预处理过程)就已经完成了,但也因此难以 发现 潜在的错误及其它代码维护问题,它的实例像: #define INT int #define TRUE 1 #define Add(a,b) ((a)+(b)); #define Loop_10 for (int i=0; i<10; i++) 在Scott Meyer的Effective C++一书的条款1中有关于#define语句弊端的分析,以及好的替代方法,大家可参看。 三、typedef与#define的区别 从以上的概念便也能基本清楚,typedef只是为了增加可读性而为标识符另起的新名称(仅仅只是个别名),而#define原本在C中是为了定义常量 ,到了C++,const

基础-内存

不问归期 提交于 2020-01-13 00:53:34
什么是内存 内存(Memory)是计算机中最重要的部件之一,它是程序与CPU进行沟通的桥梁。计算机中所有程序的运行都是在内存中进行的,因此内存对计算机的影响非常大,内存又被称为 主存 ,其作用是存放 CPU 中的运算数据,以及与硬盘等外部存储设备交换的数据。只要计算机在运行中,CPU 就会把需要运算的数据调到主存中进行运算,当运算完成后CPU再将结果传送出来,主存的运行也决定了计算机的稳定运行。 内存的物理结构 在了解一个事物之前,你首先得先需要 见 过它,你才会有印象,才会有想要了解的兴趣,所以我们首先需要先看一下什么是内存以及它的物理结构是怎样的。 内存的内部是由各种IC电路组成的,它的种类很庞大,但是其主要分为三种存储器 随机存储器(RAM):内存中最重要的一种,表示既可以从中读取数据,也可以写入数据。当机器关闭时,内存中的信息会 丢失 。 只读存储器(ROM):ROM 一般只能用于数据的读取,不能写入数据,但是当机器停电时,这些数据不会丢失。 高速缓存(Cache):Cache 也是我们经常见到的,它分为一级缓存(L1 Cache)、二级缓存(L2 Cache)、三级缓存(L3 Cache)这些数据,它位于内存和 CPU 之间,是一个读写速度比内存 更快 的存储器。当 CPU 向内存写入数据时,这些数据也会被写入高速缓存中。当 CPU 需要读取数据时

go 指针使用

*爱你&永不变心* 提交于 2020-01-13 00:22:22
参考: https://time.geekbang.org/column/article/18042?utm_source=weibo&utm_medium=xuxiaoping&utm_campaign=promotion&utm_content=columns 指针示例: type Dog struct { name string } func (dog *Dog) SetName(name string) { dog.name = name } 对于基本类型Dog来说,*Dog就是它的指针类型。而对于一个Dog类型,值不为nil的变量dog,取址表达式&dog的结果就是该变量的值(也就是基本值)的指针值。 如果一个方法的接收者是*Dog类型的,那么该方法就是基本类型Dog的指针方法。 从传统意义上说,指针是一个指向某个确切的内存地址的值。这个内存地址可以是任何数据或代码的起始地址,比如,某个变量、某个字段或某个函数。 在 Go 语言中还有其他几样东西可以代表“指针”。其中最贴近传统意义的当属uintptr类型了。该类型实际上是一个数值类型,也是 Go 语言内建的数据类型之一。 再来看 Go 语言标准库中的unsafe包。unsafe包中有一个类型叫做Pointer,也代表了“指针”。 unsafe.Pointer可以表示任何指向可寻址的值的指针

重新认识C语言指针(上)

北慕城南 提交于 2020-01-12 23:38:20
​ 独创性并不是首次观察某种新事物,而是把旧的、很早就是已知的,或者是人人都视而不见的事物当新事物观察,这才证明是有真正的独创头脑 —尼采 <p align="center">本文已经收录至我的GitHub,欢迎大家踊跃star 和 issues。</p> <h3 align="center"><a href=" https://github.com/midou-tech/articles " target="_blank"> https://github.com/midou-tech/articles</a></h3&gt ; <h4 style="color:red;text-align:center">点关注,不迷路!!! </h4> 序言  指针是C语言学习者绕不过的一道坎,也是C语言学习者不得绕过的一道坎。辨别一个人C语言学的好赖就看他对指针的理解怎么样。指针内容也是工作面试经常问到的问题。本文将带你重新认识那个绊倒你的指针,以解大家的心头之惑(恨)。 为什么要学习指针?  有同学就要说了,既然指针这么难,这么不通俗易懂,为什么要学习他呢?其他高级语言都是把这块基本屏蔽掉了,不在让程序员直接操作指针,这里不直接操作指的是不让程序员用指针进行运算和强转而不是彻底没有了。举个java的例子 Object obj= new Object(); Object sec= obj;

C语言基础:指针

旧街凉风 提交于 2020-01-12 18:10:52
【指针】 一、指针变量与定义 C语言有两种变量:其中变量(普通变量)存储内容值;地址变量(指针变量)存储地址值。 1、定义格式 类型名 *指针变量名;*是指针变量的标志,不包含在变量名里 注: (1)定义变量(普通变量、指针变量)都必须在前面有类型名。前类型后分号为定义语句。除此之外,其它语句都是执行语句。 (2)在定义指针变量时,指针变量名前的 * 表示现定义的是一个指针类型变量。星号并不是指针变量名的一总分,只是一个标志。 (3)指针变量专门用来存地址,禁止将一个整型直接赋给一个指针变量。 2、指针变量的引用 “&”取地址运算符,通过&运算符可以取出普通变量的地址。 “*”指针运算符,*可以取出指针变量所指向的普通变量的值(间接引用普通变量)。功能是 *地址 -》 取出内容值。 “&”“*”是单目运算符,优先级2级,方向从右向左 指针变量运算方法:(口诀四)地址变量得地址,得谁地址指向谁, 有*为内容值,不是读就是写,*在赋值号左边为写,其它都为读。无*为地址值,地址赋值意味着改指向。 注: (1)可以通过赋值使一个指针变量“指向”某一普通变量(指针变量=&普通变量)。 指针变量必须定义且初始化后再使用。 (2)在C语言中正确的做法是先让指针变量指向一个确定的存储单元后,再通过该指针变量引用它所指向的存储单元。 (3)变量名(普通变量、指针变量)都表示其存储单元内的值。 (4