我的大學作業有點問題。我真的不明白指標和參考發生了什么。有人可以指出我在哪里犯了錯誤嗎?
using namespace std;
int i, n, maax, *position;
void tablica()
{
int tab[n];
cout<<"enter data:"<<endl;
for (i=0; i<n; i )
{
cin>>tab[i];
}
maax = tab[0];
for (i=0; i<n; i )
{
if (maax<tab[i])
{
maax=tab[i];
*position=i 1;
}
}
}
int main()
{
cout<<"array size:"<<endl;
cin>>n;
tablica();
cout<<"max el. position is: "<<&position<<endl;
return 0;
}
uj5u.com熱心網友回復:
您不應該使用全域變數(請參閱Are global variables bad?)。int tab[n];不是標準 C ,它是一個可變長度陣列,只能在某些編譯器上作為擴展使用(請參閱為什么可變長度陣列不是 C 標準的一部分?)。段錯誤是因為您從不為該位置分配記憶體,它被初始化是因為它是全域的,但它不指向一個int(請參閱Is dereferenceing a pointer that is equal to nullptr undefined behavior by the standard?)。
您不需要任何陣列來獲取最大值和位置。并且無需在代碼中使用指標。確定讀取輸入的同一回圈中的最大值和位置,并從函式回傳結果,而不是使用全域變數:
#include <iostream>
int tablica(int n) {
std::cout<<"enter data:\n";
int max = 0;
int max_pos = 0;
std::cin >> max;
for (int i=1; i<n; i ) {
int number = 0;
std::cin>>number;
if (max<number) {
max=number;
max_pos = i;
}
}
return max_pos;
}
int main()
{
std::cout<<"input size:\n";
int n;
std::cin>>n;
int position = tablica(n);
std::cout<<"max el. position is: "<< position << "\n";
return 0;
}
uj5u.com熱心網友回復:
看看函式應該做什么:
“函式回傳最大元素。通過指標和位置傳遞陣列。通過參考”
它不應該讀取任何陣列元素。
它不應接收或回傳全域變數中的值。
它不應該使用指向該位置的指標。
它應該被傳遞一個陣列(作為指標)和某個地方來存盤最大位置(作為參考),并回傳最大值。
也就是說,它的原型應該是這樣的
int tablica(const int* input, int size, int& max_position)
main應該是這樣的:
int main()
{
int n = 0;
cout << "Array size: " << endl;
cin >> n;
int* data = new int[n];
for (int i = 0; i < n; i )
{
cin >> data[i];
}
int position = -1;
int max_element = tablica(data, n, position);
cout << "The maximum element is " << max_element << ", at index " << position << endl;
delete [] data;
}
實施tablica左側作為練習。
uj5u.com熱心網友回復:
當然,我們可以為您提供一點幫助。但是關于指標和參考的整個主題不能在關于 SO 的簡短回答中涵蓋。你需要讀一本書。
以下將非常簡化,實際上還有更多。但讓我們從這個簡單的解釋開始。
讓我給你一個典型的例子,它經常在 C 或早期的 C 書籍中使用。查看swap應該交換 2 個變數的值的函式。
#include <iostream>
void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
}
int main() {
int a = 1, b = 2;
swap(a, b);
std::cout << "a: " << a << "\tb: " << b << '\n';
}
我們希望在呼叫函式之后swap,“a”將包含 2,“b”將包含 1。但事實并非如此。因為在這種情況下(并且默認情況下),給函式的變數swap是按值傳遞的。因此,編譯器將生成一些代碼并將變數“a”和“b”的值復制到一些本地內部存盤中,也可以通過名稱“a”和“b”訪問。因此,原始的“a”和“b”將永遠不會被觸及或修改。通過按值傳遞變數,副本將是 mdae。這通常是有意的,但在此示例中不起作用。
下一個發展階段是指標。指標也是一個包含值的變數。但這次是記憶體中另一個變數的地址。如果你有一個變數,int a=3;那么 3 存??儲在記憶體中的某個位置(由聯結器的編譯器決定),你可以訪問名為“a”的記憶體區域。
指標可以存盤此變數的記憶體地址。所以不是變數“a”的值3,而是變數“a”在記憶體中的地址。指標指向存盤 3 的那個記憶體區域。如果要訪問此值,則需要使用* operator. 要獲取變數“a”的地址,您可以撰寫&a. 但這有什么幫助?
它可以幫助您間接地從函式中獲取修改值或結果值。例子:
#include <iostream>
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int a = 1, b = 2;
swap(&a, &b);
std::cout << "a: " << a << "\tb: " << b << '\n';
}
在main我們獲取變數“a”和“b”的地址并將其提供給函式。函式的地址(指標)現在將作為值提供給函式。將制作指標的副本(實際上并非如此),但這并沒有什么壞處,因為我們現在可以通過取消參考指標來修改變數的原始值。然后函式結束,我們將在原始變數“a”和“b”中找到正確的值。
但是,眾所周知,指標很難理解并且很容易出錯。因此發明了“參考”。它是普通變數的一種別名。好的一點是,如果您傳遞對函式的參考,那么您可以立即修改原始值。這讓事情變得非常方便。
函式交換可以寫成
#include <iostream>
void swap(int &a, int &b) {
int temp = a;
a = b;
b = temp;
}
int main() {
int a = 1, b = 2;
swap(a, b);
std::cout << "a: " << a << "\tb: " << b << '\n';
}
這給出了預期的結果。而且要簡單得多。
Now to your code. First, VLAs (variable length arrays), namely the int tab[n]; where 'n' is no compile time constant, are a not a ppart of the C language. You canot use them. You could and should use a std::vector instead, but you did not yet learn about it. So we will use new, to allocate some memory dynamically. Please note: In reality, new, raw pointers for owned memory and C-Style arrays should not be used. But anyway.
Then let us look at your requirements
function returns the max element. pass the array by the pointer and the pos. by the reference
因此,我們需要一個函式來計算陣列中的最大元素,然后回傳該值,并另外復制最大元素在變數中的位置,作為參考提供給函式。我們將為陣列的大小添加一個附加引數,因為我們不會在這里使用 VLA。陣列將由指標給出。
所以你的函式原型將是:
int getMaxElement(int *array, int sizeOfArray, int& positionOfMaxValue)
為了實作這樣的功能,我們創建了一個內部變數來保存最大值,稍后我們將回傳該最大值。然后,我們將回圈中的所有值與該最大值進行比較,如果找到更大的值,則存盤這個新結果。作為初始值,我們可以簡單地取陣列的第一個值。
例子:
#include <iostream>
int getMaxElement(int* array, int sizeOfArray, int& positionOfMaxValue) {
int resultingMaxValue = 0;
if (sizeOfArray > 0) {
resultingMaxValue = array[0];
for (int i = 0; i < sizeOfArray; i) {
if (array[i] > resultingMaxValue) {
resultingMaxValue = array[i];
positionOfMaxValue = i;
}
}
}
return resultingMaxValue;
}
int main() {
// Get array size from user
std::cout << "\nPlease enter the array size: ";
int arraySize = 0;
std::cin >> arraySize;
// Create an array
int* array = new int[arraySize];
// Read all values into the array
for (int i = 0; i < arraySize; i)
std::cin >> array[i];
// Now calculate the max value and position of the max value
int position = 0;
int maxValue = getMaxElement(array, arraySize, position);
// Show result
std::cout << "\n\nResult:\nThe maximum value '" << maxValue << "' is at position " << position << '\n';
delete[] array;
}
請記住:這是一個非常簡化的解釋
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/417916.html
標籤:
上一篇:如何按ID對物件陣列進行排序?
