我目前正在尝试学习在C中一起使用指针和函数,我认为这并不容易。 我试图打印数组中的最后一个元素,它实际上执行相反的操作并打印第一个元素。 我知道人们通常使用for循环,但是我无法弄清楚该如何解决此类问题,因此我认为我可以使用if语句来尝试。
编辑: 如果在这种情况下语句不起作用,为什么会这样?看来应该可行...
我的main.c文件:
#include <stdio.h>
#include <stdlib.h>
#include "functions.h"
#define Size 7
int main(void)
{
int array1[] = { 11, 88, 5, 9, 447, 8, 68, 4 };
maxValue(array1, Size);
return 0;
}
我的functions.h文件:
#pragma once
#ifndef FUNCTIONS_H
#define FUNCTIONS_H
int maxValue(const int *, int);
#endif
我的functions.c文件:
#include "functions.h"
#include <stdio.h>
#include <stdlib.h>
int maxValue(const int *array1, int Size)
{
int max = array1[0];
if (max < array1[Size]) {
Size++;
max = array1[Size];
}
printf("Max value: %d \n", max);
}
答案 0 :(得分:0)
在这种情况下为什么if语句不起作用?似乎应该这样做是合理的……?因为在这里
if (max < array1[Size]) { }
Size
被定义为7
,并且您正在将array1[0]
与array1[7]
进行比较,即11 < 4
-> false,因此它不会输入{{ 1}}块,因此最后一个if
执行并打印printf
。但是,如果max
块变为true,则进一步的if
会导致访问超出范围的数组元素,这会导致未定义的行为。
Size++
答案 1 :(得分:0)
让我们模拟当CPU使用这些参数进入maxValue函数时CPU的功能。 1。。变量max
的值为array1[0]
,即11。
2。。如果max
(11)小于array1[7]
(4)。不会,因此不会执行if
块。
3。:打印max
:打印11。
另一件事:您的程序导致未定义的行为。让我们来看一个示例,其中array1[0]
是3而不是11。将执行if块(3 <4),因此:
Size
增至8。
max
被分配了array1[8]
。由于array1
中的最后一个索引为7(这就是您声明数组的方式),因此您正在访问不应该访问的内存地址。这是不确定的行为。
答案 2 :(得分:0)
名称maxValue()
和max
会误导您并使您尝试执行的操作感到困惑。 lastValue()
和last
会更有意义。
但是在C语言中,由于数组的长度已知,因此您尝试执行的操作没有任何意义,因此您可以直接访问最后一个元素:
int array1[] = { 11, 88, 5, 9, 447, 8, 68, 4 };
int array_length = sizeof(array1) / sizeof(*array1) ;
printf("Lastvalue: %d \n", array1[array_length - 1] ) ;
但是,您不能在函数中执行此操作,因为数组不是C中的第一类数据类型,并且在传递给函数时将“降级”为简单指针,而没有任何有关所指向数组大小的信息。具有大小信息的调用函数也必须传递该信息(就像您已经做过的那样,但是随后看起来很困惑):
void printLast( int* array, int length )
{
printf( "Lastvalue: %d \n", array1[length - 1] ) ;
}
很难理解为什么您认为可能需要任何其他代码,或者您的maxValue()
函数打算实现什么。因此,您说“应该工作”的“逻辑”是:
如果第一个数组元素的值小于最后一个数组元素的值,则在数组末尾打印一个 undefined 值;否则,打印数组的第一个元素。
如果要打印最后一个元素,则只需打印它,第一个元素的值与它无关。无论哪种方式,您都不应索引超出数组末尾的位置-该值是不确定的。