指针

const in C/C++

↘锁芯ラ 提交于 2020-02-06 04:53:33
1. const 对象必须初始化,因为一旦创建后值不能改变。 Eg :   const int i = GetSize(); // 正确 : 运行时初始化   const int j = 42; // 正确:编译时初始化   j = 33; // 错误:试图向 const 对象写值   const int k; // 错误: k 是一个未经初始化的常量 2.默认状态下, const 对象仅在文件内有效。 若想在多个文件内工作,只在一个文件中定义 const ,而在其他多个文件中声明并使用它。 解决办法,对于 const 变量,不论声明定义都加 extern ,这样只需定义一次即可。 Eg :   //file1.cc 定义并初始化一个常量,该常量能被其他文件访问   Extern const int bufSize = fcn();   //file1.h   Extern const int bufSize; // 与 file1.cc 中定义的 bufSize 是同一个 3.把引用绑定到 const 对象上,称之为 对常量的引用 Eg1 :   const int c = 1024;    const int &r1 = c; // 正确   r1 = 42; // 错误: r1 是对常量的引用   int &r2 = c; // 错误:试图让一个非常量引用指向一个常量引用

2.4 const限定符

随声附和 提交于 2020-02-06 04:52:34
#因为const对象一旦创建后其值就不能被改变,因此const对象必须初始化 默认状态下,const对象仅在文件内有效..... #编译器会在编译过程把用到const变量的地方替换成起对应的值 #如果我们想要只在一个文件中定义const对象,而在多个文件中使用它(多文件间共享const对象) 解决办法是:对于const变量不管是在定义还是声明都添加extern关键字,这样只需定义一次即可 2.4.1 const的引用(常量引用) 初始化和const的引用 对const的引用可以引用一个非const的对象(常量引用对象的值不能被改变,但并不代表常量引用所引用对象的值是不能被改变的) 2.4.2 指针和const 想要存放常量对象的地址,只能使用指向常量的指针 和常量引用一样,指向常量的指针也没有规定其所指向的对象必须是一个常量 const指针(常量指针) 常量指针必须初始化,并且一旦赋值后,其值就不能再改变(也就是存放在指针中的地址不能改变) 把*放在const关键字之前,说明指针是一个常量 2.4.3 顶层const 顶层const:表示指针是一个常量(即常量指针) 底层const:表示指针指向的值是一个常量 2.4.4 constexpr和常量表达式 常量表达式:是指值不会改变并且能够在编译时计算出结果的表达式 constexpr变量 C++11标准规定

指向const对象的指针 const指针

故事扮演 提交于 2020-02-06 04:51:18
1. 指向const对象的指针 指向const对象的指针是一个指针,但是不能通过它来修改它所指向的对象的值。 声明方法: const int *p; const指针对象在初始化后不允许对指针指向的对象的值进行修改,因此不能用一个普通的指针指向一个const 指针对象。否则,如果可以用普通指针修改const指针对象的值,那就失去了const的意义。例如: const int i = 1; int * p = &i; // ERROR! const int *p = &i; // OK! 需要注意的地方: 指向const对象的指针本身不是const类型,所以这个指针可以指向另一个const对象; 指向const对象的指针可以被赋予一个非const对象的地址,但是不能试图通过此指针来修改该对象的值。 2. const指针 const指针就是一个指针,但是它本身是const类型的。所以它初始化后不能再改变它的指向,即不能让它再指 向一个新的对象。 声明方法: int* const p; // 指向非const对象的const指针 const int* const p; // 指向const对象的const指针 const指针可以指向const对象和非const对象,但是两者声明方法不同。使用const指针不可以修改其地址值,但是const指针指向非const对象

指向const对象的指针 const指针

空扰寡人 提交于 2020-02-06 04:50:16
1. 指向const对象的指针 指向const对象的指针是一个指针,但是不能通过它来修改它所指向的对象的值。 声明方法: const int *p; const指针对象在初始化后不允许对指针指向的对象的值进行修改,因此不能用一个普通的指针指向一个const 指针对象。否则,如果可以用普通指针修改const指针对象的值,那就失去了const的意义。例如: const int i = 1; int * p = &i; // ERROR! const int *p = &i; // OK! 需要注意的地方: 指向const对象的指针本身不是const类型,所以这个指针可以指向另一个const对象; 指向const对象的指针可以被赋予一个非const对象的地址,但是不能试图通过此指针来修改该对象的值。 2. const指针 const指针就是一个指针,但是它本身是const类型的。所以它初始化后不能再改变它的指向,即不能让它再指 向一个新的对象。 声明方法: int* const p; // 指向非const对象的const指针 const int* const p; // 指向const对象的const指针 const指针可以指向const对象和非const对象,但是两者声明方法不同。使用const指针不可以修改其地址值,但是const指针指向非const对象

借用指针交换两个变量

大憨熊 提交于 2020-02-06 03:45:42
借用指针交换两个变量 # include <stdio.h> void swab ( int * pa , int * pb ) { int tmp = * pa ; //*pa=a * pa = * pb ; //*pb=b * pb = tmp ; } int main ( ) { int a = 10 ; int b = 20 ; printf ( "%d %d\n" , a , b ) ; swab ( & a , & b ) ; //不可直接交换(注意地址) printf ( "%d %d\n" , a , b ) ; return 0 ; } 来源: CSDN 作者: 贪心的柠檬 链接: https://blog.csdn.net/qq_42627691/article/details/104186689

指针与数组

倖福魔咒の 提交于 2020-02-06 01:57:42
数组与指针 此处有与最早发的指针博客有很多相同处,相同处不在过多赘述 #include < stdio . h > void fun1 ( int * arr [ ] , int n ) ; int main ( ) { int a = 0 , b = 1 , c = 2 , d = 3 ; int * arr [ 4 ] ; arr [ 0 ] = & a ; arr [ 1 ] = & b ; arr [ 2 ] = & c ; arr [ 3 ] = & d ; fun1 ( arr , 4 ) ; printf ( "a=%d b=%d c=%d d=%d" , * arr [ 0 ] , * arr [ 1 ] , * arr [ 2 ] , * arr [ 3 ] ) ; return 0 ; } void fun1 ( int * arr [ ] , int n ) { for ( int i = 0 ; i < n ; i ) { * arr [ i ] = * arr [ i ] 1 ; } } 运行结果: a = 1 b = 2 c = 3 d = 4 指针数组 #include < stdio . h > int main ( ) { //指针数组是一个特殊的二维数组模型 //数组名既是数组首元素的地址 int a [ ] = { 1 , 2 , 3 } ;

双指针法

不打扰是莪最后的温柔 提交于 2020-02-06 01:53:45
算法思想 双指针法有时也叫快慢指针,在数组里是用两个整型值代表下标,在链表里是两个指针,一般能实现O(n)的时间解决问题,两个指针的位置一般在第一个元素和第二个元素或者第一个元素和最后一个元素,快指针在前“探路”,当符合某种条件时慢指针向前挪。 例题 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。 示例 1: 给定数组 nums = [1,1,2], 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 你不需要考虑数组中超出新长度后面的元素。 示例 2: 给定 nums = [0,0,1,1,1,2,2,3,3,4], 函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。 你不需要考虑数组中超出新长度后面的元素。 解题思路 由于数组有序 ,我们可以放置两个指针 i 和 j,其中 i 是慢指针,而 j 是快指针。只要 nums[i] = nums[j],我们就增加 j 以跳过重复项。

C++知识点

百般思念 提交于 2020-02-06 01:53:21
int **p和int *p有什么区别 int *p表示的是一级指针,表示p所指向的地址里面存放的是一个int类型的值。int **p表示的是二级指针,表示p所指向的地址里面存放的是一个指向int类型的指针。 一级指针存放变量的地址,指向的值是变量的内容。如int* p={1,2,3}, p=数组的首地址,*p=数组的第一个值; 二级指针存放一级指针的地址,指向一级指针。如int*p ={1,2,3}, int**pp=&p,pp=指针p的首地址,*pp=数组的首地址,**pp=数组第一个值1。 指针数组的数组名传递参数对应为指针的指针即二级指针,二维数组的数组名传递参数对应为数组指针即指向一维数组的指针 一级指针通过形参,可以修改实参中指针所指向的地址中的值。修改不了实参中指针所指向的地址。需要借助二级指针才可以。 int *p :一级指针,表示p所指向的地址里面存放的是一个int类型的值 int **p :二级指针,表示p所指向的地址里面存放的是一个指向int类型的指针(即p指向的地址里面存放的是一个指向int的一级指针) 例如: int i=10; //定义了一个 整型变量 int *p=&i; //定义了一个指针指向这个变量 int **p1=&p; //定义了一个二级指针指向p指针 那么取出10的值方式为: printf("i=[%d]\n",*p); printf("i

数组函数指针

时光总嘲笑我的痴心妄想 提交于 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作为传递参数传给数组,注意这个数组里面存储的内容也是指针类型。

指针的简单了解

北慕城南 提交于 2020-02-06 01:01:49
指针的简单了解 你们初学指针头就大了,是不是?不要慌,接下来跟我了解下! ** 指针P是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。 说到变量,变量又是什么呢? 变量可以储存计算机的计算结果,变量是通过变量名访问的,变量是可变的。 指针实际上也是变量,它里面存储的实际是内存中的一个地址。举例来说:你如果要去找一个人,那你得知道他在哪?那就得知道他所在的地址,以说指针就是就相当于这个人的地址了。 举个例子: # include <stdio.h> int main ( ) { int a = 3 ; int b = 2 ; int * c ; c = & b ; int * * d ; //二重指针只能指向一重指针,以此类推 d = & c ; printf ( "a的地址=%d\n" , & a ) ; //取变量a的地址 printf ( "b的地址=%d\n" , & b ) ; //取变量b的地址 printf ( "c的地址=%d\n" , & c ) ; //取变量c的地址——指针也是一种变量 printf ( "d的地址=%d\n" , & d ) ; //取变量d的地址——同理 printf (