指针

【424】C语言二级指针

谁说胖子不能爱 提交于 2020-01-15 23:54:23
参考: C 指向指针的指针 指向指针的指针是一种多级间接寻址的形式,或者说是一个指针链。通常,一个指针包含一个变量的地址。当我们定义一个指向指针的指针时,第一个指针包含了第二个指针的地址,第二个指针指向包含实际值的位置。 一个指向指针的指针变量必须如下声明,即在变量名前放置两个星号。例如,下面声明了一个指向 int 类型指针的指针: int **var; 当一个目标值被一个指针间接指向到另一个指针时,访问这个值需要使用两个星号运算符,如下面实例所示: var:int 变量 ptr:指向 var 的指针 pptr:指向 ptr 的指针 表示 var 值的三种方法: var *ptr:ptr 指针所对应的值,即 var **pptr:*pptr 指针所对应的值,即 ptr,所以 **pptr = *ptr = var 表示 ptr 值(var 地址,pptr 对应的值)的四种方法: &var:表示 var 的地址,即 ptr ptr &(*ptr):*ptr 相当于 var *pptr:*pptr 指针所对应的值,即 ptr,所以 *pptr = ptr = &var 表示 pptr 值(ptr 地址)的三种方法: &ptr:表示 ptr 的地址,即 pptr pptr &(*pptr):*pptr 相当于 ptr 表示 pptr 地址的方法: &pptr #include

container_of与二级指针结合产生的美妙应用

谁说胖子不能爱 提交于 2020-01-15 16:50:05
container_of根据一个地址得源struct地址,而二级指针能把这个地址到处送,到处用,于是美妙的结果就是,不必搜索,只需要container_of即可从简单的链表中查到整个元素 来源: CSDN 作者: ytfy339784578 链接: https://blog.csdn.net/ytfy339784578/article/details/103946699

2015年09月12日

☆樱花仙子☆ 提交于 2020-01-15 15:48:27
异或运算特性 a ^ b = c 则 c ^ b = a , c ^ a = b, 双向链表需要两个指针,一个指向前一个结点,一个指向后一个结点, 异或双向链表只用一个指针,该指针等于 前后两两个结点指针的异或的结果,这样节省了空间,但增加了计算。 一般的双向链表节点中包含两个指针,分别指向前驱和后继。异或指针双向链表的节点只有一个“指针”,这个指针是另外两个指针的“异或”值,并利用以下运算得到其前驱和后继的指针: a^(a^b)=b (a^b)^b=a 在C语言中,可以先把指针转换为无符号整型数然后进行异或,另外还应保存指向链表头尾节点的指针。 按照这种思路,节点中的这一个指针还可以是“加法”值,或者其他指针运算得到的值。如果是加法,可以利用以下运算得到其前驱和后继指针: (x+y)-x=y (x+y)-y=x 需要注意的是,这样的“加法”运算或“异或”运算都是针对指针的值本身的,即指针转换为无符号整型后的运算。不能跟指针运算(如两个指针相减)混淆。 异或指针双向链表的建立、遍历等参考如下实现。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51

嵌入式面试题(C/C++)

故事扮演 提交于 2020-01-15 11:38:27
目录 概念区分 编程 概念区分 变量的声明和定义有什么区别 为变量分配地址和存储空间的称为定义,不分配地址的称为声明。一个变量可以在多个地方声明,但只能在一个地方定义。加入 extern 修饰的是变量的声明,说明此变量将在文件以外或在文件后面部分定义。 说明:很多时候一个变量,只是声明,不分配内存空间,知道具体使用时才初始化,分配内存空间,如外部变量。 sizeof和strlen的区别 sizeof 是一个操作符 ( 关键词 ) ,strlen是库函数。 sizeof 的参数可以是数据的类型,也可以是变量,而strlen只能以结尾为‘\ 0 ‘的字符串作参数。 编译器在编译时就计算出了 sizeof 的结果。而strlen函数必须在运行时才能计算出来。 sizeof 计算的是数据类型占内存的大小,而strlen计算的是字符串实际的长度。 写一个“标准”宏MIN # define min(a,b) ((a)<=(b)?(a):(b)) //加圆括号,保护数据 一个指针可以是volatile吗? 可以,因为指针和普通变量一样,有时也有变化程序的不可控性。常见例:子中断服务子程序修改一个指向一个buffer的指针时,必须用 volatile 来修饰这个指针。 a 和 &a 有什么区别请写出以下代码的打印结果,主要目的是考察a和&a的区别。 # include <stdio.h> int

2019春第六周作业

与世无争的帅哥 提交于 2020-01-15 09:02:35
这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/software-engineering-class2-20 我在这个课程的目标是 能基本了解指针的定义与运用 这个作业在那个具体方面帮助我实现目标 本次作业有需要运用指针来返回多个数值 参考文献 C语言程序设计 求两数平方根之和 函数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=%.2f\n", y ); return 0; } /* 请在这里填写答案 */ 输入样例: 12 20 输出样例: y=7.94 实验代码 double fun (double *a,

leetcode_75.颜色分类

↘锁芯ラ 提交于 2020-01-15 08:55:33
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。 此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。 注意: 不能使用代码库中的排序函数来解决这道题。 示例: 输入: [2,0,2,1,1,0] 输出: [0,0,1,1,2,2] 进阶: 一个直观的解决方案是使用计数排序的两趟扫描算法。 首先,迭代计算出0、1 和 2 元素的个数,然后按照0、1、2的排序,重写当前数组。 你能想出一个仅使用常数空间的一趟扫描算法吗? 解析:题目要求使用常数空间,且只进行一次扫描。 定义三个指针l,m,r。 扫描过程中保证: 1、l指针之前的数字均为0 2、l指针与m指针之间的数字均为1 3、r指针之后的数字均为2, 因此只要令m指针与r指针之间没有数字,便可以确定整个数组。 class Solution { public : void sortColors ( vector < int > & nums ) { int l = 0 ; int m = 0 ; int r = nums . size ( ) - 1 ; while ( m <= r ) { //如果m指向0,将m与l交换,并各前进一步 if ( nums [ m ] == 0 ) { swap ( nums [ l ] , nums [

const和非const函数重载

我的未来我决定 提交于 2020-01-15 04:49:29
成员函数后面加const,表示在该函数中不能对类的数据成员进行改变,比如下面的代码: 1 #include <stdio.h> 2 3 class A 4 { 5 private: 6 mutable int aa; 7 public: 8 A(){} 9 int x() 10 { 11 printf("no const\n"); 12 return aa++; 13 } 14 int x() const 15 { 16 printf("const\n"); 17 return aa++; 18 } 19 }; 20 21 int main() 22 { 23 A a1; 24 a1.x(); 25 26 const A a2; 27 a2.x(); 28 29 return 0; 30 } 代码的运行结果为: 首先说明成员函数后面加const这种机制,这是软件工程上的一种机制,在先前的软件开发中,类中各个函数的实现是由不同人完成了,所以大家共同操作同一组的数据成员,这样就会产生一种麻烦,会有些菜鸟或者不遵守规则的家伙胡乱的修改数据成员。当时只能用文档的形式来约束大家,在开发文档里清楚的写上你的这个函数实现不允许任何的修改数据成员,但是这样的文档的形式还是不能很好的约束那些家伙,于是C++语言的设计者 Stroustrup想出来一个好的办法: 如果成员函数的后面加上了const

c语言 指针数组

╄→гoц情女王★ 提交于 2020-01-15 04:46:49
指针数组 指针数组是数组,指针数组每个元素是一个指针 指针数组的定义:type* parray[n]; type* 是数组中每个元素的类型 parray 为数组名 n为大小 例子: float* a[3] //a是一个数组,每个元素的类型是float* code: #include <stdio.h> #include <string.h> #define DIM(a) (sizeof(a)/sizeof(*a)) int lookup_keyword(const char* key, const char* table[], const int size) { int ret = -1; int i = 0; for(i=0; i<size; i++) { if( strcmp(key, table[i]) == 0 ) { ret = i; break; } } return ret; } int main() { const char* keyword[] = { "do", "for", "if", "register", "return", "switch", "while", "case", "static" }; printf("%d\n", lookup_keyword("return", keyword, DIM(keyword))); printf("%d\n"

空指针异常

家住魔仙堡 提交于 2020-01-15 04:39:08
在使用变量引用一个数组时,变量必须指向一个有效的数组对象,如果该变量的值为null,则意味着没有指向任何数组,此时通过该变量访问数组的元素会出现空指针异常,接下来通过一个案例来演示这种异常,如下所示。 ArrayDemo07.java public class ArrayDemo07 { public static void main(String[] args) { int [] arr = new int [3]; // 定义一个长度为3 的数组 arr[0] = 5; // 为数组的第一个元素赋值 System. out .println( "arr[0]=" + arr[0]); // 访问数组的元素 arr = null ; // 将变量 arr 置为 null System. out .println( "arr[0]=" + arr [0]); // 访问数组的元素 } } 运行结果如下图所示: 通过上图所示的运行结果可以看出,上述代码中第4、5行代码都能通过变量arr正常地操作数组。第6行代码将变量置为null,当第7行代码再次访问数组时就出现了空指针异常NullPointerException。 来源: CSDN 作者: little-stars 链接: https://blog.csdn.net/weixin_41874888/article/details

include头文件和前置声明

折月煮酒 提交于 2020-01-15 04:15:15
两个原则 第一个原则是,如果使用的仅仅是一个类的指针或者引用,没有使用这个类的具体对象(非指针),也没有访问到类的具体成员,那么前置声明就可以了。因为指针这一数据类型的大小是特定的,编译器可以获知。 第二个原则应该是,尽量在CPP文件中包含头文件,而非在头文件中。假设类A的一个成员是是一个指向类B的指针,在类A的头文件中使用了类B的前置声明并编译成功,那么在A的实现中我们需要访问B的具体成员,因此需要包含头文件,那么我们应该在类A的实现部分(CPP文件)包含类B的头文件而非在声明部分(H文件)包含。 类的前向声明带来的问题【has incomplete type】 在使用前向声明的类 或者 结构体的时候,只能用作指针或者引用。如果直接定义实例,是编译无法通过的。因为此时,编译器不知道类的具体定义(类内部的成员等),无法构造实例对象。 来源: CSDN 作者: 低头走路,抬头看天 链接: https://blog.csdn.net/rusbme/article/details/103818167