Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >指向const双指针参数的非连续指针参数。

指向const双指针参数的非连续指针参数。
EN

Stack Overflow用户
提问于 2010-08-08 23:36:39
回答 1查看 2.5K关注 0票数 7

星号前面的const修饰符意味着使用这个指针所指向的值不能被更改,而指针本身可以用来指向其他的东西。在下面

代码语言:javascript
代码运行次数:0
复制
void justloadme(const int **ptr)
{
    *ptr = new int[5];
}

int main()
{
    int *ptr = NULL;
    justloadme(&ptr);
}

不应该允许justloadme函数编辑传递的param所指向的整数值(如果有的话),而它可以编辑int*值(因为const不是在第一颗星之后),但是为什么在GCC和VC++中都会出现编译器错误呢?

GCC:错误:从int**const int**的无效转换

VC++: error C2664:‘ convert’:无法将参数1从'int **‘转换为'const int **’。转换丢失限定符

为什么它说转换会失去限定符?它不是获得了const限定符吗?此外,它是否类似于strlen(const char*),在那里我们传递一个非const char*

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-08-08 23:44:20

与大多数情况一样,编译器是正确的,直觉是错误的。问题是,如果允许执行特定的任务,您可能会破坏程序中的const-正确性:

代码语言:javascript
代码运行次数:0
复制
const int constant = 10;
int *modifier = 0;
const int ** const_breaker = &modifier; // [*] this is equivalent to your code

*const_breaker = & constant;   // no problem, const_breaker points to
                               // pointer to a constant integer, but...
                               // we are actually doing: modifer = &constant!!!
*modifier = 5;                 // ouch!! we are modifying a constant!!!

标记为*的线是该违规行为的罪魁祸首,并且由于该特定原因被禁止使用。该语言允许将const添加到最后一个级别,但不允许添加第一个级别:

代码语言:javascript
代码运行次数:0
复制
int * const * correct = &modifier; // ok, this does not break correctness of the code
票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3438125

复制
相关文章
用指向函数的指针作函数参数
/**有2个整数a,b,有用户输入1,2,或3,如输入1, 程序就给出a和b中大者,输入2,就给出a和b中小者, 输入3,就给出a和b的和**/ #include <stdio.h> #include <stdlib.h> int main() { int f(int x,int y,int (*p)(int ,int )); int max(int x,int y); int min(int x,int y); int sum(int x,int y); int
谙忆
2021/01/19
6150
指针数组与指向指针的指针
指针数组与指向指针的指针 http://wlkc.gdqy.edu.cn/jpkc/portal/blob?key=173314 指针数组和数组指针的区别 http://allew.blog.163.
阳光岛主
2019/02/19
1.8K0
C语言 | 指向指针的指针
这道理放在C语言学习上也一并受用。在编程方面有着天赋异禀的人毕竟是少数,我们大多数人想要从C语言小白进阶到高手,需要经历的是日积月累的学习。
小林C语言
2021/03/10
3K0
const 指针 常量指针 指针常量 常量指针常量
指针常量在定义时必须初始化,且不允许修改,但其指向的地址的值可以修改,即p不可改写而*p可以改写。
叶茂林
2023/07/28
1410
C语言 | 指向指针的指针排序
这道理放在C语言学习上也一并受用。在编程方面有着天赋异禀的人毕竟是少数,我们大多数人想要从C语言小白进阶到高手,需要经历的是日积月累的学习。
小林C语言
2021/03/10
1.7K0
c语言之指向指针的指针
定义:int **p; 实例: #include<stdio.h> #include<iostream> int main() { char* str[] = { "hello","hi","nihao" }; char** p; for (int i = 0; i < 3; i++) { //指针指向数组中的第几个指针 p = str + i; //想要获得指针指向的值,通过*来解引用 printf("%s\n", *p
西西嘛呦
2020/08/26
1.5K0
指向函数的指针
程序中定义函数后,对程序进行编译时,编译系统为函数分配一段存储空间存储二进制代码,这段内存空间的起始地址(也称入口地址)称为函数的指针。
pigeon
2022/04/11
8090
指向函数的指针
指向函数的指针
Author: bakari   Date: 2012.8.8 做好总结我觉得是把知识学扎实必不可少的实践环节。这个知识点是当初自己在学习这一块做的一些笔记,现在在知识提升的情况下将它重新整理一下以作巩固之用。 我们知道一段代码在内存中是由地址的,一个函数在编译时会被分配给一个入口地址,这个地址就是该函数中第一条指令的地址,这就是函数的指针。当调用一个函数时出了通过函数名来调用之外,还可以通过指向该函数的指针变量来调用。切记,和一切指针变量一样,一个指向函数的指针其初值也不能为空。因为它在使用之前必须被赋予
Linux云计算网络
2018/01/10
1.3K0
指向函数的指针
const修饰指针
3.const既修饰号又修饰p 7. *p只读 8. p只读 9. 简而言之:指针指向内容不可以改变,指针指向不能发生改变
大忽悠爱学习
2021/03/02
4400
this指针和const
在C语言里面const是用来修饰变量的,那么在C++里面const是用来修饰什么,在C++lconst实际修饰的是this指针,上面的代码在编译器看来是下面这个样子的
DeROy
2020/05/13
1.5K0
this指针和const
指针(二) - (const)指针与常量
const使用 声明一个常量 关键字const用来告诉编译器一个一旦被初始化过的变量就不能被修改 int a; const int n; 一 常量指针 指针指向一个常量 修饰指针指向 #include int main() { //常量指针 const int num = 10; // num = 100; int* p1 = &num; *p1 = 100; printf("%d\n", num); // 可以通过p1修改num (c语言可以c++不可以) // 不可以通过p2,p3修
木杉乀
2021/04/02
4170
指针叠加会不断改变指针指向
下面是错误的代码演示: #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> void test() { //指针叠加会不断改变指针指向 //指针p一开始指向堆区开辟内存的首地址 char* p = (char*)malloc(sizeof(char)*20); char buf[] = "hello"; int len = strlen(buf); //包含\0 for (
大忽悠爱学习
2021/03/02
4670
指针叠加会不断改变指针指向
【Android FFMPEG 开发】FFMPEG 方法中指针类型参数说明 ( 一维指针类型参数 | 二维指针类型参数 )
① 创建并初始化结构体指针 : AVPacket *avPacket = av_packet_alloc() , 该结构体是一个一维指针 ;
韩曙亮
2023/03/27
4320
【双指针】早早开启双指针的大门
使用同向双指针,两个指针首先都指向第一个元素,然后先固定第一个指针,第二个指针向后遍历,判断两个指针指向的数组元素之和是否等于给定的目标和值,如果不等,等第二个指针遍历完后,第一个指针再向后移动一位,第二个指针再从第一个指针的位置向后遍历整个数组,以此类推。(有点像选择排序的过程)
MicroFrank
2023/01/16
5830
7.4 指向函数的指针
①定义指向函数的指针变量,并不意味着这个指针变量可以指向任何函数,它只能指向在定义时指定的类型的函数
小林C语言
2019/08/09
8500
指向类成员的指针
关注点在于 count_fruit 的第三个参数,这样就省去了单独编写 count_apples 和 count_oranges 函数的麻烦。
ClearSeve
2022/02/10
8160
使用指向函数的指针
/**输入2个整数,然后让用户选择1或2,选1时调用max函数,输出2者中的大数, 选2时调用min函数,输出2者中的小数**/ #include <stdio.h> #include <stdlib.h> int main() { int max(int x,int y); int min(int x,int y); int (*p)(int ,int ); int n,a,b; scanf("%d%d",&a,&b); scanf("%d",&n);
谙忆
2021/01/19
8080
C++ 指针和const指针赋值
即const指针既可以指向const数据又可以指向非const数据(数据为非指针类型)。
全栈程序员站长
2022/09/14
7640
C++ 指针和const指针赋值
C:数组与指针,指针与const
我们都知道一个指针是代表的一个地址,指针,顾名思义,指向一块区域。那么数组呢?数组并不是代表一堆变量,数组其实也是一种指针,指向一个地址,一般是指向数组的首地址,也就是 a[0]的地址。 a==&a[0] a 是一个指针,指向数组 a 的首地址。 下面四种函数原型都是等价的,第一个参数均为一个地址(指针)。 若定义 int a[10];
字节星球Henry
2021/08/09
8170
8.5 指向函数的指针
1、如果在程序中定义了一个函数,在编译时,编译系统为函数代码分配了一段存储空间,这段存储空间的起始地址(又称入口地址)称为这个函数的指针。
小林C语言
2019/07/12
9360

相似问题

函数调用,其中指针指向非const,指针指向相同地址的const参数。

10

指向指向const char参数的指针的快速指针

12

作为参数指向const值的指针和指针

14

将指向const的指针或指向const的const指针声明为形式参数

55

指向非Const变量的const指针

41
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文