Jump to content
Forumu Destekleyenlere Katılın ×
Paticik Forumları
2000 lerden beri faal olan, çok şukela bir paylaşım platformuyuz. Hoşgeldiniz.

bir C pointer sorusu


Artariel

Öne çıkan mesajlar

tam anladım demiştim şu olayı ki bir farklı şey daha çıktı..

şimdi
char array[5]={'a','b','c','d','e'};
*(array+1) bize b'yi gösterecek işte dizilerle ilgili bu tür şeyleri anlamışken şöyle bir şey çıktı karşıma hayatım söndü:

char *x[];


bu ne anlama gelir tam olarak nasıldır kullanımı ? özellikle fonksiyonlarda görüyorum abc(char *x[]) veya abc(char *x) türünde şeyler.. nedir bunlar
Link to comment
Sosyal ağlarda paylaş

Her ne kadar aslinda pointer ve arrayler ayni seyler olmasa da, char *x[]; ile char **x ayni sey diyebilirim. -aslinda bana x adinda, bir karakter arrayina point edebilecek bir pointer ver demis oluyorsun-

char *x'in ne anlama geldigini sordugun icin tam olarak pointer'in ne oldugunu bilmedigini tahmin ediyorum. Bu yuzden de http://www.eskimo.com/~scs/cclass/notes/sx10.html burayi okumani oneriyorum.
Link to comment
Sosyal ağlarda paylaş

char* x veya char *x, x'in bellekteki adresi. Ve aslında dediğin gibi, char a[5] = { bi şeyler }; dediğin zaman a da char tipindeki 5 elemandan oluşan dizinin ilk elemanının adresini gösteren bi pointer oluyo. Bu elemanlar bellekte sıralı halde bulunduğundan, dizinin 2. elemanına (indeksi 1) erişmek istediğinde bellekte a+1 konumuna bakıyosun.

Elinde bi pointer varsa, * operatörünü kullanarak o pointer'ın işaret ettiği yerdeki değeri öğrenebilirsin.


int *x = (int*)calloc(1, sizeof(int));
*x = 5;


Henüz pointer kavramına aşina değilsen ilk satırın üstünde fazla durmana gerek yok, yaptığı şey bellekten 1 int boyutunda bi yer almak ve adresini döndürmek. 2. satırda da o adresteki değere 5 sayısını atıyosun.
*(a+1) demesi de bundan. Parantezin içindeki kısım aslında bi bellek adresi. Onun içinde bulunan değeri almak için de * operatörü kullanılıyo işte.

Örneği bi dosyadan int veriler okuyosun ve her türlü değer yazılmış olabilir. Hatalı okuma ihtimaline karşılık ne yapacaksın? 0 döndürsen olmaz, 0 yazılmış olabilir. -1 de aynı şekilde. Bunun üstesinden gelebilmek için genelde şöyle fonksiyonlar tanımlanır:

bool degeroku(int *x)
{
if(okuyabildim)
{
*x = bilmemne;
return true;
}
else return false;
}

Fonksiyonu bu şekilde tanımladıktan sonra, gereken yerde bellekten 1 int boyutunda yer alır, adresini bu fonksiyona verirsin. int x = 5; şeklinde tanımladığın değişkenlerin adreslerini de gönderebilirsin. Bunun için de & operatörü kullanılır. Yani aşağıdaki iki kullanım da aynı işi yapıyo.

int *x = (int*)calloc(1, sizeof(int));
if(degeroku(x)) printf("%d", *x);
else printf("hata var");


int x;
if(degeroku(&x)) printf("%d", x);
else printf("hata var");

Dikkat etmen gereken nokta, x'in ilk kullanımda int bi değerin adresini gösteren bi pointer, ikinci kullanımda o değerin kendisi olduğu.
Örneğin sprintf yukardaki gibi çalışır ve char dizileri üzerinden işlem yapar. Bunun için de yarattığın dizinin ilk elemanın adresini ister senden. Aşağıdaki gibi mesela:
char buffer[256];
sprintf(buffer, "merhaba sdfdsafjka");
Dönüş değerine bakarak başarılı mı değil mi öğrenebilirsin.

char *x[]; dediği şey de aslında bi char dizisinin ilk elemanın adresini gösteren pointerı gösteren pointerın adresi. Pointer pointerı yani.

Konu pointer olunca ancak bu kadar özet geçilebiliyo :(
Link to comment
Sosyal ağlarda paylaş

boyle karistirdigin zamanlarda, ben operator siralamasini gozden gecirmeni tavsiye ederim ve cdecl programini kullanmani,


Type `help' or `?' for help
cdecl> explain char *x[];
declare x as array of pointer to char
cdecl> explain char (*x)[];
declare x as pointer to array of char
cdecl>
Link to comment
Sosyal ağlarda paylaş

×
×
  • Yeni Oluştur...