1 Nisan 2020 Çarşamba

Pass By Reference - Sadece C++ İçindir

Giriş
C dilinde pass by reference diye bir şey yoktur. Açıklaması şöyle
The C language is pass-by-value without exception. Passing a pointer as a parameter does not mean pass-by-reference.
Çünkü C ve C++ farklı dillerdir. Açıklaması şöyle
Currently, C++ includes neither in its entirety, although the common subset of C and C++ is significant. Some features are missing, and there are incompatible differences between the languages. 
Her iki dilin örtüştüğü alan fazla olsa da bazı farklılıklar gösterebilirler. Bunu şeklen şöyle düşünmek lazım
+------------------------------+
|   Valid C++ Only             |
|                              | 
|      +-----------------------+-------+
|      | Valid C and C++ with  | Valid |
|      | identical behavior    | C     |
|      |                       | Only  |
|      |                       |       |
|      |                       |       |
|      +-----------------------+       |
|      | Valid C and C++ with  |       |
|      | different behavior    |       |
|      +-----------------------+-------+
|                              |
|                              |
+------------------------------+
C++ kabaca şu C standartları ile uyumludur.
C++20 is based on C18
C++17 is based on C11
C++14 is based on C99
C++11 is based on C99
C++03 is based on C89/C90
C++98 is based on C89/C90
C++ Kodunu C Haline Getirmek
Şu kod C++ tarafından derlenir ve çalışır.
#include <stdio.h>

void swap(int & x, int & y) 
{ 
  int z = x; 
  x = y; 
  y = z; 
}

int main() 
{
  int a = 0, b = 1;
  swap(a, b);
  printf("a is now %d\n", a);
  printf("b is now %d\n", b);
}
Bu kodu C'de çalıştırmak için şöyle yaparız. swap metodundaki parametreler pointer haline geldi ve metodun çağırırken & kullanımına dikkat.
#include <stdio.h>

void swap(int* const x, int* const y)  
{ 
  int z = *x; 
  *x = *y; 
  *y = z; 
}  

int main() 
{
  int a = 0, b = 1;
  swap(&a, &b);
  printf("a is now %d\n", a);
  printf("b is now %d\n", b);
}
C Kodu Haline Getirince de Pass By Reference Olmaz - Illusion of pass-by-reference
Pointer'lar her zaman pass by value ile çalışır.
Örnek
Elimizde şöyle bir kod olsun
#include <stdio.h>

void function2(int *param) {
  printf("I've received value %d\n", *param);
  (*param)++;
}

int main(void) {
  int variable = 111;

  function2(&variable);
  printf("variable %d\n", variable);
  return 0;
}
Çıktı olarak şunu alırız. Burada sanki pointer pass by reference ile geçiyormuş gibi görünür. 
I've received value 111
variable=112
Ancak kodu şöyle değiştirelim
#include <stdio.h>

void function2(int *param) {
  printf("param's address %d\n", param);
  param = NULL; //Bu satıra dikkat
}

int main(void) {
  int variable = 111;
  int *ptr = &variable;

  function2(ptr);
  printf("ptr's address %d\n", ptr);
  return 0;
}
Çıktı olarak şunu alırz. Eğer pointer reference olarak geçseydi değeri metod çıkışında null olurdu ancak olmadı.
param's address -1846583468
ptr's address -1846583468

Hiç yorum yok:

Yorum Gönder