指针未正确打印值
Pointer doesn't print the value correctly
我想问一下为什么我的代码不起作用我已经厌倦了很多事情都无济于事由于某些特殊原因程序可以找到数组的最小值但找不到它的最小值returns 的值为 0.000000。希望下面的代码对您有所帮助。
这是我的主要功能。
int main(void){
float array[5] = {12,32,56,67,54};
float min;
float max;
float *ptrMin;
float *ptrMax;
ptrMin = &min;
ptrMax = &max;
findMinMax(array, ptrMin, ptrMax);
printf("%f %f", *ptrMin, *ptrMax);
system("pause");
return 0;
}
我使用函数 findMinMax 将 return 两个值返回到我的主要函数。
void findMinMax(float *array, float *ptrMin, float *ptrMax){
float ptrMinTemp;
float ptrMaxTemp;
*ptrMin = ptrMinTemp;
*ptrMax = ptrMaxTemp;
while(*array){
if(*array < ptrMinTemp){
ptrMinTemp = *array;
*ptrMin = ptrMinTemp;
}
if(*array > ptrMaxTemp){
ptrMaxTemp = *array;
*ptrMax = ptrMaxTemp;
}
array++;
}
}
在添加此评论之前,是的,我创建了原型函数并包含了正确的头文件。
#include <stdio.h>
#include <stdlib.h>
void findMinMax(float *array, float *ptrMin, float *ptrMax);
在控制台中我得到以下信息:
0.000000 67.000000Press any key to continue . . .
你的问题
您正在将变量 ptrMin
和 ptrMax
设置为未初始化变量 ptrMinTemp
和 ptrMaxTemp
的内容:
float ptrMinTemp;
float ptrMaxTemp;
*ptrMin = ptrMinTemp;
*ptrMax = ptrMaxTemp;
解决方案
只需将指针的内容设置为数组的第一个单元格,如下所示:
*ptrMin = *array;
*ptrMax = *array;
while(*array)
本质上是错误的,这意味着,"stop when *array is zero",你不能这样做,除非你把 0 放在数组的末尾以将其标记为数组的末尾。
因此您必须发送数组的大小:
// ...
findMinMax(array, ptrMin, ptrMax, sizeof array / sizeof *array);
void findMinMax(float *array, float *ptrMin, float *ptrMax, size_t size)
// ...
for (size_t i = 0; i < size; i++) // use array[i] not *array in that loop
另外你没有初始化你的 min
和 max
:
float min = array[0];
float max = array[0];
数组没有等于 0.0f 的标记值。因此这个循环
while(*array){
没有意义。
此外变量
float ptrMinTemp;
float ptrMaxTemp;
未明确初始化且具有不确定的值。结果这些语句
*ptrMin = ptrMinTemp;
*ptrMax = ptrMaxTemp;
导致未定义的行为。
考虑到函数findMinMax
中的数组没有改变。所以第一个参数应该用限定符 const
.
声明
一般来说,由于 pointer
可以指向一个空数组,因此该函数应该有某种方式来指示这种特殊情况。
函数findMinMax
可以这样定义
int findMinMax( const float *array, size_t n, float *ptrMin, float *ptrMax )
{
int success = n != 0;
if ( success )
{
*ptrMin = *array;
*ptrMax = *array;
for ( ; n--; ++array )
{
if ( *array < *ptrMin )
{
*ptrMin = *array;
}
else if ( *ptrMax < *array )
{
*ptrMax = *array;
}
}
}
return success;
}
并称赞
findMinMax( array, sizeof( array ) / sizeof( *array ), ptrMin, ptrMax );
这是一个演示程序
#include <stdio.h>
int findMinMax( const float *array, size_t n, float *ptrMin, float *ptrMax )
{
int success = n != 0;
if ( success )
{
*ptrMin = *array;
*ptrMax = *array;
for ( ; n--; ++array )
{
if ( *array < *ptrMin )
{
*ptrMin = *array;
}
else if ( *ptrMax < *array )
{
*ptrMax = *array;
}
}
}
return success;
}
int main(void)
{
float array[5] = { 12, 32, 56, 67, 54 };
float min;
float max;
float *ptrMin;
float *ptrMax;
ptrMin = &min;
ptrMax = &max;
findMinMax(array, sizeof( array ) / sizeof( *array ), ptrMin, ptrMax);
printf("%f %f", *ptrMin, *ptrMax);
return 0;
}
它的输出是
12.000000 67.000000
我想问一下为什么我的代码不起作用我已经厌倦了很多事情都无济于事由于某些特殊原因程序可以找到数组的最小值但找不到它的最小值returns 的值为 0.000000。希望下面的代码对您有所帮助。
这是我的主要功能。
int main(void){
float array[5] = {12,32,56,67,54};
float min;
float max;
float *ptrMin;
float *ptrMax;
ptrMin = &min;
ptrMax = &max;
findMinMax(array, ptrMin, ptrMax);
printf("%f %f", *ptrMin, *ptrMax);
system("pause");
return 0;
}
我使用函数 findMinMax 将 return 两个值返回到我的主要函数。
void findMinMax(float *array, float *ptrMin, float *ptrMax){
float ptrMinTemp;
float ptrMaxTemp;
*ptrMin = ptrMinTemp;
*ptrMax = ptrMaxTemp;
while(*array){
if(*array < ptrMinTemp){
ptrMinTemp = *array;
*ptrMin = ptrMinTemp;
}
if(*array > ptrMaxTemp){
ptrMaxTemp = *array;
*ptrMax = ptrMaxTemp;
}
array++;
}
}
在添加此评论之前,是的,我创建了原型函数并包含了正确的头文件。
#include <stdio.h>
#include <stdlib.h>
void findMinMax(float *array, float *ptrMin, float *ptrMax);
在控制台中我得到以下信息:
0.000000 67.000000Press any key to continue . . .
你的问题
您正在将变量 ptrMin
和 ptrMax
设置为未初始化变量 ptrMinTemp
和 ptrMaxTemp
的内容:
float ptrMinTemp;
float ptrMaxTemp;
*ptrMin = ptrMinTemp;
*ptrMax = ptrMaxTemp;
解决方案
只需将指针的内容设置为数组的第一个单元格,如下所示:
*ptrMin = *array;
*ptrMax = *array;
while(*array)
本质上是错误的,这意味着,"stop when *array is zero",你不能这样做,除非你把 0 放在数组的末尾以将其标记为数组的末尾。
因此您必须发送数组的大小:
// ...
findMinMax(array, ptrMin, ptrMax, sizeof array / sizeof *array);
void findMinMax(float *array, float *ptrMin, float *ptrMax, size_t size)
// ...
for (size_t i = 0; i < size; i++) // use array[i] not *array in that loop
另外你没有初始化你的 min
和 max
:
float min = array[0];
float max = array[0];
数组没有等于 0.0f 的标记值。因此这个循环
while(*array){
没有意义。
此外变量
float ptrMinTemp;
float ptrMaxTemp;
未明确初始化且具有不确定的值。结果这些语句
*ptrMin = ptrMinTemp;
*ptrMax = ptrMaxTemp;
导致未定义的行为。
考虑到函数findMinMax
中的数组没有改变。所以第一个参数应该用限定符 const
.
一般来说,由于 pointer
可以指向一个空数组,因此该函数应该有某种方式来指示这种特殊情况。
函数findMinMax
可以这样定义
int findMinMax( const float *array, size_t n, float *ptrMin, float *ptrMax )
{
int success = n != 0;
if ( success )
{
*ptrMin = *array;
*ptrMax = *array;
for ( ; n--; ++array )
{
if ( *array < *ptrMin )
{
*ptrMin = *array;
}
else if ( *ptrMax < *array )
{
*ptrMax = *array;
}
}
}
return success;
}
并称赞
findMinMax( array, sizeof( array ) / sizeof( *array ), ptrMin, ptrMax );
这是一个演示程序
#include <stdio.h>
int findMinMax( const float *array, size_t n, float *ptrMin, float *ptrMax )
{
int success = n != 0;
if ( success )
{
*ptrMin = *array;
*ptrMax = *array;
for ( ; n--; ++array )
{
if ( *array < *ptrMin )
{
*ptrMin = *array;
}
else if ( *ptrMax < *array )
{
*ptrMax = *array;
}
}
}
return success;
}
int main(void)
{
float array[5] = { 12, 32, 56, 67, 54 };
float min;
float max;
float *ptrMin;
float *ptrMax;
ptrMin = &min;
ptrMax = &max;
findMinMax(array, sizeof( array ) / sizeof( *array ), ptrMin, ptrMax);
printf("%f %f", *ptrMin, *ptrMax);
return 0;
}
它的输出是
12.000000 67.000000