#include<stdio.h>
void foo(int **p)
{
int j=11;
*p = &j;
printf("%d ", **p);
}
int main(void)
{
int i = 10;
int *const p = &i;
foo(&p);
printf("%d ", *p);
return 0;
}
编译时:
example.c:12:2: warning: passing argument 1 of ‘foo’ discards ‘const’ qualifier from pointer target type [enabled by default]
foo(&p);
example.c:2:6: note: expected ‘int **’ but argument is of type ‘int * const*’
void foo(int **p)
运行中:
11 11
这里p是一个常量指针,那么为什么没有错误来改变它的内容而只是警告?
我对上述计划的疑问是因为以下计划:
#include<stdio.h>
int main(void)
{
int var1 = 0, var2 = 0;
int *const ptr = &var1;
ptr = &var2;
printf("%d\n", *ptr);
return 0;
}
编译时:
error: assignment of read-only variable ‘ptr’
ptr = &var2;
答案 0 :(得分:0)
int * const p;
表示指向int 的Const指针,其中p不能指向其他位置。所以,你得到了警告。
答案 1 :(得分:0)
为什么这里没有更改常量位置的错误 只是警告?
<强>案例1 强>
事实上在:
void foo(int **p) // p is a pointer to pointer to int
{
int j=11;
*p = &j; //equivalent of p = &i in main()
printf("%d ", **p);
}
您未在主要内容中更改p
的值。你呢?是
通过
*p = &j;
您只是更改main()
p中存储的值。
<强>情况2 强>
ptr = &var2; // You are making ptr point to the memory address of &var2
这是违法的,因为ptr
是constant
。
答案 2 :(得分:0)
int * const p
是指向int
的常量指针(p
的位置仅供读取使用)
foo
的原型必须是
void foo(int * const *p)
- &gt;指向int
的const指针的指针(*p
的位置是只读的)
*p = &j;
error: assignment of read-only location ‘*p’
但这是有效的:
**p = j;
- &gt;取消引用*p
=访问i
main
您正在寻找:
#include <stdio.h>
void foo(int * const *p)
{
int j = 11;
**p = j;
printf("%d ", **p);
}
int main(void)
{
int i = 10;
int * const p = &i;
foo(&p);
printf("%d ", *p);
return 0;
}
输出:
11 11
相同
int var1 = 0, var2 = 0;
int *const ptr = &var1;
ptr = &var2; <-- You can not change the location of ptr
答案 3 :(得分:0)
为什么更改内容没有错误,只是警告?
在第一种情况下,您只是“仅”获得警告,因为您只是通过将const
传递到可能被滥用的上下文中来准备路由到灾难,即被分配一些东西。然而,尚不清楚是否真的得到了分配。
在第二种情况下,代码实际上 它可能没有,它分配给const
,因此编译器将其视为错误。