c语言指针

链表--笔记

爱⌒轻易说出口 提交于 2019-11-27 19:40:02
链表 知识点摘于b站教程视频: https://www.bilibili.com/video/av16869217?from=search&seid=12191125613016121321 1.链表是存在于堆内存,存放在不连续的存储空间,在这些不连续的存储空间使用指针去作为一个索引。 a) 链表的结构体 struct Student{ int num;//学号 数据域 char name[10];//姓名 数据域 struct Student *pnext;//表示这个指针指向下一个节点(即下一个结构体) 指针域 }; p是指针 不断用这个结构体的指针去指向下一个结构体,这就是一个链表。 b)节点是什么? 链表是由节点组成的,上图中每个结构体就是链表的节点。 小tips: typedef struct Student{ int num;//学号 char name[10];//姓名 struct Student *pnext;//表示这个指针指向下一个节点(即下一个结构体) }STU; //c语言中,如果加上了第一句的typedef ,STU就是一种数据类型(相当于struct Student、 )若没有加typedef ,STU只是一个变量 //在c++中 ,Student可以直接作为数据类型。 2.两种链表 3.动态内存的使用(链表) STU *pStu=NULL; /

指针以及内存分配

本秂侑毒 提交于 2019-11-27 19:00:33
原文:http://blog.csdn.net/bizhu12/article/details/6532235 1. 指针很灵活,这使得指针很难管理,在定义指针时,将在栈中开辟一块内存存放指针的地址(栈内的内存由系统分配和释放),指针的地址内存只是存放指针的地址,不存放指针指向的数据,值得注意的是,定义指针时指针会随机指向一块内存,如int *p;p会指向一块不为空的内存,相当危险,例如执行判断if(!p){ printf("p为空");};这里不会输出"p为空";所以在定义时想让指针p为空,则要int *p = NULL;如果程序大的话,执行的结果出错都不知道在哪里. 2. 给指针赋值,我能力有限,只知道有两种,一种是在堆上分配一块内存(动态分配内存),让指针指向这块内存.第二种是指针指向栈上的一块内存(一般是定义一个非指针变量,让指针指向这个变量);这两种方法通过以下代码实现: [cpp] view plain copy #include <stdio.h> #include <malloc.h> int main() { //第一种 int *p1 = ( int*)malloc( sizeof( int)); //动态的在堆上分配一块内存(手动分配) scanf( "%d",p1); printf( "%d/n",*p1); free(p1); //释放内存 //第二种

C语言程序设计(十)

孤者浪人 提交于 2019-11-27 18:47:41
第十章 字符串 字符串常量是由一对双引号括起来的一个 字符串序列 字符串实际就是由若干个有效数字构成且以字符'\0'作为结束的一个字符序列 C语言没有提供字符串数据类型,因此字符串的存取要用 字符型数组 来实现 字符型数组是由字符构成的数组,仅当其最后一个元素是'\0'时才表示字符串 字符串结束标志'\0'也占一个字节的内存,但 它不计入字符串的实际长度,只计入数组的长度 正确写法: char str[6] = {'H','e','l','l','o','\0'}; char str[] = {'H','e','l','l','o','\0'}; char str[] = {"hello"}; char str[] = "hello"; 编译系统会根据字符串中字符的个数来确定数组的大小 数组的大小为字符串中实际字符的个数加1 多个字符串需要存放在二维字符数组中 数组第一维的长度代表要存储的字符串的个数,可以省略 但是 第二维的长度不能省略 字符指针:指向字符型数据的指针变量 只要将字符串的首地址赋值给字符指针,即可让字符指针指向一个字符串 字符串常量本身代表的就是存放它的常量存储区的首地址,是一个地址常量 char *ptr = "Hello"; 等价于 char *par; ptr = "Hello"; /* 将保存在常量存储区中的"Hello"的首地址赋值给ptr

C语言程序设计(九)

泪湿孤枕 提交于 2019-11-27 18:43:51
第九章 指针 C程序中的变量都是存储在计算机内存特定的存储单元中的,内存中的每个单元都有唯一的地址 通过 取地址运算符& 可以获得变量的地址 //L9-1 #include <stdio.h> int main() { int a = 0, b = 1; char c = 'A'; printf("a is %d, &a is %p\n", a, &a); printf("b is %d, &b is %p\n", b, &b); printf("c is %c, &c is %p\n", c, &c); return 0; } //运行结果 a is 0, &a is 0060FF0C b is 1, &b is 0060FF08 c is A, &c is 0060FF07 %p格式符,表示输出变量a、b、c的地址值 地址值是一个十六进制的无符号整数,其字长一般与主机的字长相同 变量的地址:变量在内存中所占的存储空间的首地址 变量的值:变量在存储空间中存放的数据 变量的名字:对程序中数据存储空间的一种抽象 指针:存放变量的地址的特殊类型的变量 类型关键字 *指针变量名; 类型关键字代表指针变量要指向的变量的数据类型,即 指针变量的基类型 指针变量的定义只是声明了指针变量的名字及其所能指向的数据类型,并没有说明指针变量究竟指向了哪里 //L9-2 #include <stdio

C++指针、引用、const

走远了吗. 提交于 2019-11-27 18:15:57
int a = 3; int *p = &a; //定义指针p指向变量a *p = 4; //*p代表a的值 int b = 5; p = &b; //p指向变量b *p = 6; //此时*p代表b的值 int c[3] = {2,5,7}; p = c; //此时p是指向数组c的指针,具体指向数组的第一个元素,即(&c[0]/p/c)三种写法等价 int a = 3; int &b = a; //定义引用b为变量a的引用,即a的别名(可理解为a的“外号”) b = 6; //给b赋值6即给a赋值6,此时a的值变为6 引用经典用法: void ValueExchange(int &a,int &b) { int temp = 0; temp = a; a = b; b = temp; } ValueExchange(a,b); //调用函数实现值交换,和c语言指针相比,c++的引用显然更加简便 const int a = 3; //常量a = 3,const的含义即是被const修饰的值拒绝被修改 const int *p; int const *p; //两种写法等价,此时无法用*p来改变p指向的变量的值,因为*p被const所修饰 int * const p; //此时p只能指向一个变量,之后不能指向其他变量,因为p被const修饰 const int &b; int

指针与强制类型转换

≯℡__Kan透↙ 提交于 2019-11-27 17:57:31
指针与强制类型转换 1、变量的数据类型的含义 (1)、所有的类型的数据存储在内存中,都是按照二进制格式存储的。所以内存中只有0和1,不知道是int的还是float的 或者是其它类型的。 (2)、int、char、short等属于整形,他们的存储方式(数据转换成二进制往内存中放的方式)是相同的,只是内存格子 的大小不同而已(所以这几种整形就彼此叫二进制兼容格式);而float和double的存储方式彼此不同,和整形更不同。 (3)、int a = 5;编译器给a分配4字节空间,并且将5按照int类型的存储方式转成二进制存到a所对应的内存空间中去(a 做左值的);我们printf去打印a的时候(a此时做右值),printf内部的vsprintf会按照格式化字符串(就是printf传参 的第一个字符串中的%d之类的东西)所代表的类型去解析a所对应的内存空间,解析出来的值用来输出。也就是说,存进去 时是按照这个变量本身的数据类型来存储的(譬如本例中a为int,所以按照int格式来存储);但是取出来时是按照printf 中%d之类的格式化字符串的格式来提取的。此时虽然a所代表的内存空间中的二进制序列(比如101010并没有改变),但是 怎么理解(怎么把这些二进制数转换成数字)就不一定了。譬如我们用%d来解析,那么还是按照int格式解析,那么值自然 是5;但是如果用%f来解析

C语言-再论指针与数组

白昼怎懂夜的黑 提交于 2019-11-27 15:55:53
指针与数组的天生姻缘 1、以指针方式来访问数组元素 (1)、数组元素使用时不能整体访问,只能是单个访问。访问形式有两种:数组形式和指针形式。 (2)、数组形式访问数组元素:数组名[下标];(下标从0开始 (3)、指针格式访问数组元素:*(指针+偏移量); (4)、数组下标方式和指针方式均可以访问数组元素,两者的实质是一样的。在编译器内部都是用指针方式来访问数组的, 数组下标方式只是编译器给编程者提供了一种壳而已。所以用指针方式来访问数组才是本质的做法。 2、从内存角度理解指针访问数组的实质 (1)、数组的特点就是:数组中各个元素的地址是依次相连的,而且数组还有一个很大的特点就是数组中各个元素的类型 比较相同。类型相同就决定了每个数组元素占几个字节是相同的。 (2)、数组中的元素其实就是地址相连接、占地大小相同的一串内存空间。 这两个特点就决定了只要知道数组中一个元素的地址,就可以很容易推算出其他元素的地址。 3、指针与数组类型的匹配问题 (1)、int *p; int a[5]; p = a; //类型匹配,a做右值等同于&a[0]; (2)、int *p; int a[5]; p = &a; //类型不匹配,p是int *,&a是整个数组的指针,也就是一个数组指针类型,不是 int指针类型,所以不匹配。 (3)、&a、a、&a[0]从数值上看是完全相等的,但是从意义上看就不同了

指针理解(新手文章,勿近)

亡梦爱人 提交于 2019-11-27 15:08:20
目录 指针理解 指针理解 ​ 想要真正的详解的,请看 大佬 重要性 ​ 真正的灵魂,没有指针就没有C语言,虽然我用C的时间并不算长,但可以真切的发现这点 定义 ​ 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。它可以指向另外一个内存地址 大招理解 int p; //这是一个普通的整型变量 int *p; //首先从P 处开始,先与*结合,所以说明P 是一个指针,然后再与int 结合,说明指针所指向的内容的类型为int 型.所以P是一个返回整型数据的指针 int p[3]; //首先从P 处开始,先与[]结合,说明P 是一个数组,然后与int 结合,说明数组里的元素是整型的,所以P 是一个由整型数据组成的数组 int *p[3]; //首先从P 处开始,先与[]结合,因为其优先级比*高,所以P 是一个数组,然后再与*结合,说明数组里的元素是指针类型,然后再与int 结合,说明指针所指向的内容的类型是整型的,所以P 是一个由返回整型数据的指针所组成的数组 int (*p)[3]; //首先从P 处开始,先与*结合,说明P 是一个指针然后再与[]结合(与"()"这步可以忽略,只是为了改变优先级),说明指针所指向的内容是一个数组,然后再与int 结合,说明数组里的元素是整型的.所以P 是一个指向由整型数据组成的数组的指针 int **p; //首先从P 开始,先与*结合

C++之指针与数组区别

点点圈 提交于 2019-11-27 10:05:32
C++/C程序中,数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。指针可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用指针来操作动态内存。指针远比数组灵活,但也更危险。 下面以字符串为例比较指针与数组的特性。 一、修改内容 1 char a[] = “hello”; //“hello”位于常量存储区,a在全局(静态)初始化区 2 a[0] = ‘X’; 3 cout << a << endl; 4 char *p = “world”; // 注意p指向常量字符串 p位于全局(静态)初始化区 5 p[0] = ‘X’; // 编译器不能发现该错误 常量字符串的内容是不能被修改的 6 cout << p << endl; 二、内容复制与比较 1 // 数组… 2 char a[] = "hello"; //a在全局(静态)初始化存储区 “hello”在常量存储区 3 char b[10]; //b在全局(静态)未初始化存储区 4 strcpy(b, a); // 不能用 b = a; 5 if(strcmp(b, a) == 0) // 不能用 if (b == a) 6 … 7 // 指针… 8 int len = strlen(a); 9 char *p =

C语言-指针到底是什么?

守給你的承諾、 提交于 2019-11-27 09:47:07
1、指针到底是什么? (1)、指针变量与普通变量的区别 指针的实质就是一个变量,他跟普通变量没有任何本质区别。指针完整的名字应该叫做指针变量,简称为指针。 2、为什么需要指针? (1)、指针的出现是为了实现间接访问。在汇编中都有间接访问,其实就是CPU的寻址方式中的间接寻址。 (2)、间接访问(CPU的间接寻址)是CPU设计时决定的,这个决定了汇编语言必须能够实现间接寻址,又决定了 汇编之上的C语言也必须实现间接寻址。 (3)、高级语言Java/C#等没有指针,那么他们怎么实现间接访问?答案就是语言本身帮助我们封装好了。 3、指针使用三部曲: 定义指针变量(int *p)、 关联指针变量(p = &a // 让p指向变量a )(p = (int *)4 //让p指向内存地址为4的那个变量) 解引用(*p = 555;//把555放到p所指向的变量中) (1)、当我们int *p;定义一个指针变量p时,因为p是局部变量,所以也遵循C语言局部变量的一般规律(定义局部 变量并且未初始化,则值是随机的),所以此时p变量中存储的是一个随机的数字。 (2)、此时如果我们解引用p,则相当于我们访问了以这个随机数字为地址的内存空间。那这个空间到底能不能访问 到就不知道了(可能行也可能不行),所以如果直接定义指针变量未绑定有效地址就去解引用的话,几乎会出现大的bug。 (3)、指针绑定的意义就在于