bir yapıyı bir işleve geçirmek çalışmıyor [yineleme]
Aşağıdaki kodda, int'i bir yapı içinde ikiye bölmek için main dışında bir fonksiyon oluşturdum.
Bundan sonra yeni değeri yazdırmak istiyorum. Ancak, çıktı değeri hala eski değerdir.
Yapı ve işaretçiler hakkındaki temel bilgimin yeterince iyi olmadığına inanıyorum.
Biri bana bu konuda yardım edebilir mi? Çok teşekkürler!!!
typedef struct{
int age;
int wage;
}person;
void divide(person A)
{
person half;
half.age = A.age / 2;
half.wage = A.wage / 2;
A = half;
}
int main(void)
{
person A;
A.age = 30;
A.wage = 35000;
divide(A);
printf("%i\n", A.age);
}
Yanıtlar
İşlev divide
, yapılar değer bakımından geçtiği için bu yapının bir kopyasını değiştiriyor. İşlevin orijinali değiştirebilmesi için işaretçiyi yapıya iletmeniz gerekecektir.
void divide(person* A)
{
person half;
half.age = A->age / 2;
half.wage = A->wage / 2;
*A = half;
}
divide
Orijinal yapının adresi ile çağrıldı
divide(&A);
Sınavı geçtikten sonra A
için divide
, bir kopyası A
oluşturulur. Bu kopyayı içeride değiştirmenin, içinde tanımladığınız divide
yerel değişken üzerinde hiçbir etkisi yoktur . Bu durumu düzeltmek için yapabileceğiniz bir almak işaretçi için . Bir işaretçi, bellekteki bir adresi etkili bir şekilde temsil eder, böylece onu örneğin, normalde erişilemeyen diğer işlevlerde tanımlanan yerel değişkenlere erişmek için kullanabilirsiniz (bunun nedenini anlamak istiyorsanız, araştırma yığını çerçeveleri ).A
main
divide
person
Yani pratikte değiştirmek divide
: için 'ın imzasını void divide(person *A)
ve değil assing bu fonksiyonun son satırında A
ne olursa olsun bunlarla A
KQUEUE operatörünü kullanarak işaret ediyor: *A = half
. Senin içinde main
işleve sonra geçmesi adresini ait A
yerine A
kendisine divide
operatörünün adresini kullanarak: divide(&A)
.
DÜZENLEME: daha da iyisi, half
doğrudan gerçekleştirerek geçici olanı oluşturmaktan kaçınabilirsiniz : A->age /= 2
ve sözdizimsel şeker A->wage /= 2
nerede ?A.x
(*A).x