当我想保护向量的修改时,如果我尝试使用它,为什么 const 子句不起作用?
Why does the const clause not work if I try to use it when I want to protect the modification of a vector?
在我正在研究的书中它说如果我将一个向量传递给一个函数,向量的名称总是被视为一个指针。
事实上是这样的。
但是我不明白为什么在第一个函数中编译器允许使用 const 子句,而在第二个函数中(我使用指针来搜索元素之间的最大值)却不允许。
在函数中,我只想防止向量被修改。
#include <stdio.h>
int find_largest(const int a[], int n);
int find_largest_with_pointer(const int *vettore, int n);
int main(void) {
int my_number[] = {5, 7, 90, 34, 12};
int n = sizeof(my_number) / sizeof(my_number[0]);
int *pmy_number = my_number;
printf("%d\n", find_largest(my_number, n));
printf("%d\n", find_largest(pmy_number, n));
printf("%d\n", find_largest_with_pointer(my_number, n));
printf("%d\n", find_largest_with_pointer(pmy_number, n));
return 0;
}
int find_largest(const int a[], int n) {
int i, max;
max = a[0];
for(i = 0; i < n; i++)
if(a[i] > max)
max = a[i];
return max;
}
int find_largest_with_pointer(const int *vettore, int n) {
int *i, max = *vettore;
for(i = vettore; i < vettore + n; i++)
if(*i > max)
max = *i;
return max;
}
由于 vettore
是指向 const int
的指针,您必须使 i
具有相同的类型。
const int *i;
int max = *vettore;
for(i = vettore; i < vettore + n; i++)
简短版本:添加 const 限定符将解决编译器警告。
int find_largest_with_pointer(const int *vettore, int n) {
// int *i, max = *vettore;
const int *i ;
int max = *vettore;
...
}
长版:
在第二个函数中,您使用了两个变量。稍微扩展一下代码
int *i ;l
it max = a[0] ;
for (
i = vettore;
i < vettore + n;
i++
) { ... }
注意行 i = vettore
,它将尝试复制 'const int * vettoreinto non-const 'int *i
。这有可能允许修改 const 向量(例如 *i = 5
),并且编译器会抱怨:
c.c:33:11: warning: assignment discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
for(i = vettore; i < vettore + n; i++)
解决方案很简单:在 const int *i
上添加 const 限定符。见上文。
在我正在研究的书中它说如果我将一个向量传递给一个函数,向量的名称总是被视为一个指针。 事实上是这样的。 但是我不明白为什么在第一个函数中编译器允许使用 const 子句,而在第二个函数中(我使用指针来搜索元素之间的最大值)却不允许。 在函数中,我只想防止向量被修改。
#include <stdio.h>
int find_largest(const int a[], int n);
int find_largest_with_pointer(const int *vettore, int n);
int main(void) {
int my_number[] = {5, 7, 90, 34, 12};
int n = sizeof(my_number) / sizeof(my_number[0]);
int *pmy_number = my_number;
printf("%d\n", find_largest(my_number, n));
printf("%d\n", find_largest(pmy_number, n));
printf("%d\n", find_largest_with_pointer(my_number, n));
printf("%d\n", find_largest_with_pointer(pmy_number, n));
return 0;
}
int find_largest(const int a[], int n) {
int i, max;
max = a[0];
for(i = 0; i < n; i++)
if(a[i] > max)
max = a[i];
return max;
}
int find_largest_with_pointer(const int *vettore, int n) {
int *i, max = *vettore;
for(i = vettore; i < vettore + n; i++)
if(*i > max)
max = *i;
return max;
}
由于 vettore
是指向 const int
的指针,您必须使 i
具有相同的类型。
const int *i;
int max = *vettore;
for(i = vettore; i < vettore + n; i++)
简短版本:添加 const 限定符将解决编译器警告。
int find_largest_with_pointer(const int *vettore, int n) {
// int *i, max = *vettore;
const int *i ;
int max = *vettore;
...
}
长版:
在第二个函数中,您使用了两个变量。稍微扩展一下代码
int *i ;l
it max = a[0] ;
for (
i = vettore;
i < vettore + n;
i++
) { ... }
注意行 i = vettore
,它将尝试复制 'const int * vettoreinto non-const 'int *i
。这有可能允许修改 const 向量(例如 *i = 5
),并且编译器会抱怨:
c.c:33:11: warning: assignment discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
for(i = vettore; i < vettore + n; i++)
解决方案很简单:在 const int *i
上添加 const 限定符。见上文。