Saya baru saja mulai mempelajari C, dan ketika melakukan satu contoh tentang meneruskan pointer ke pointer sebagai parameter fungsi, saya menemukan masalah.
Ini adalah kode contoh saya:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int* allocateIntArray(int* ptr, int size){
if (ptr != NULL){
for (int i = 0; i < size; i++){
ptr[i] = i;
}
}
return ptr;
}
void increasePointer(int** ptr){
if (ptr != NULL){
*ptr += 1; /* <----------------------------- This is line 16 */
}
}
int main()
{
int* p1 = (int*)malloc(sizeof(int)* 10);
allocateIntArray(p1, 10);
for (int i = 0; i < 10; i++){
printf("%d\n", p1[i]);
}
increasePointer(&p1);
printf("%d\n", *p1);
p1--;
free(p1);
fgets(string, sizeof(string), stdin);
return 0;
}
Masalah terjadi di baris 16, saat saya mengubah *ptr+=1
ke *ptr++
. Hasil yang diharapkan harus berupa seluruh array dan nomor 1 tetapi ketika saya menggunakan *ptr++
hasilnya adalah 0.
Apakah ada perbedaan antara +=1
dan ++
? Saya pikir keduanya sama.
c
pointers
post-increment
huy nguyen
sumber
sumber
string
.allocateIntArray
adalah nama yang buruk karena tampaknya Andamalloc
adalah array dari fungsi tersebut, tetapi Anda tidak melakukannya. Saya menyarankanfillIntArray
sebagai gantinya. 2) Anda tidak menggunakan nilai pengembalianallocateIntArray
. Saya sarankan Anda mengubah jenis pengembalian menjadivoid
. 3) Sebaiknya tidakif (ptr != NULL)
dalam fungsiincreasePointer
menjadiif (*ptr != NULL)
? 4) Cast inmalloc
tidak perlu. Lihat komentar Sourav di atas. 5) Ini:for (int i = 0; i < 10; i++){ printf("%d\n", p1[i]); }
danprintf("%d\n", *p1); p1--;
perlu dilampirkanif(p1 != NULL)
. 6)string.h
tidak digunakan.p+=1
adalah seperti++p
, tidak sepertip++
Jawaban:
Perbedaannya karena prioritas operator.
Operator post-increment
++
memiliki prioritas yang lebih tinggi daripada operator dereferensi*
. Begitu*ptr++
pula dengan*(ptr++)
. Dengan kata lain, kenaikan posting mengubah penunjuk, bukan apa yang ditunjukkannya.Operator penugasan
+=
memiliki prioritas yang lebih rendah daripada operator dereferensi*
, begitu*ptr+=1
juga dengan(*ptr)+=1
. Dengan kata lain, operator penugasan mengubah nilai yang ditunjuk penunjuk, dan tidak mengubah penunjuk itu sendiri.sumber
*p++
dan*++p
. Urutan operator yang terakhir jelas, yang pertama mengikuti.Urutan prioritas untuk 3 operator yang terlibat dalam pertanyaan Anda adalah sebagai berikut:
post-increment
++
> dereference*
> assignment+=
Anda dapat memeriksa halaman ini untuk rincian lebih lanjut tentang subjek tersebut.
Singkat cerita, untuk mengekspresikan tugas ini
*ptr+=1
menggunakan operator kenaikan setelah Anda perlu menambahkan tanda kurung ke operator dereferensi untuk memberikan operasi yang diutamakan++
seperti dalam ini(*ptr)++
sumber
Mari terapkan tanda kurung untuk menunjukkan urutan operasi
Ayo lakukan lagi dengan
Dan lagi dengan
*ptr += 1
, kami menambah nilai variabel yang ditunjuk penunjuk kami .*ptr++
, kita menambah pointer setelah seluruh pernyataan kita (baris kode) selesai, dan mengembalikan referensi ke variabel yang ditunjuk oleh pointer kita .Yang terakhir memungkinkan Anda melakukan hal-hal seperti:
Ini adalah metode umum yang digunakan untuk menyalin
src
array kedest
array lain .sumber
Pertanyaan yang sangat bagus.
Dalam "bahasa pemrograman C" K&R "5.1 Pointer dan Alamat", kita bisa mendapatkan jawaban untuk ini.
"Operator unary * dan & mengikat lebih erat daripada operator aritmatika"
"Operator unary seperti * dan ++ associate kanan ke kiri ."
// Ia bekerja seperti * (ptr ++).
Cara yang benar adalah:
sumber
* ptr + = 1: Data kenaikan yang ditunjukkan oleh ptr. * ptr ++: Penunjuk kenaikan yang mengarah ke lokasi memori berikutnya, bukan ke data yang ditunjuk penunjuk.
sumber