Dersler

View on GitHub

EEM-120 Algoritma ve Programlama II Dersi

İşaretçiler, işaretçilerin fonksiyonda parametre ve dönüş değeri olarak kullanılması

#include <stdio.h>
int main(){
    int a=20, b=30;
    int *p, *q;
    p=&a;
    q=&b;
    printf("a'nin adresi %u \n",&a);
    printf("p'nin degeri  %u \n",p);
    printf("b'nin adresi %u \n",&b);
    printf("q'nin degeri  %u \n",q);
    
    return 0;
}
a'nin adresi 3703186656 
p'nin degeri  3703186656 
b'nin adresi 3703186660 
q'nin degeri  3703186660 
#include <stdio.h>
int main(){
    int a=20, b=30;
    int *p, *q;
    p=&a;
    q=&b;
    *p=50;
    *q=70;
    printf("a'nin degeri %u \n",a);
    printf("b'nin degeri %u \n",b);
    return 0;
}
a'nin degeri 50 
b'nin degeri 70 
#include <stdio.h>
int main(){
    int a, b;
    int *p, *q;
    p=&a;
    q=&b;
    a=35;
    b=45;
    printf("p isaretcisinin isaret ettigi yerdeki deger: %u \n",*p);
    printf("q isaretcisinin isaret ettigi yerdeki deger: %u \n",*q);
    
    return 0;
}
p isaretcisinin isaret ettigi yerdeki deger: 35 
q isaretcisinin isaret ettigi yerdeki deger: 45 
#include <stdio.h>
int main(){
    //isaretcilerin tanimlamalari tek satirdada yapilabilir.
    int a, b, c, *p,*q;
    int *isaretci=&c;
    p=&b;
    q=&a;
    *p=15;
    *q=16;
    *isaretci=17;
    printf("a:%d, b:%d c:%d",*q,*p, *isaretci);
    
    
    return 0;
}
a:16, b:15 c:17
#include <stdio.h>
int main(){
    int a,*p;
    char b, *q;
    double c, *m;
    float d, *n;
    // q=&a yanlis bir atamdir.
    // isaretciye kendi turunde atama yapilabilir.
    p=&a;
    q=&b;    
    
    return 0;
}
a:16, b:15 c:17
#include <stdio.h>
int main(){
    int a,b,*p=&a, *q=&b;
    *p=25;
    *q=35;
    (*p)++;
    (*q)++;
    printf("a:%d, b:%d\n",a,b);
    q=&a;
    (*p)++;
    (*q)++;
    printf("a:%d, b:%d\n",a,b);
    return 0;
}
a:26, b:36
a:28, b:36
#include <stdio.h>
int main(){
    int a,b,*p=&a, *n=&b;
    *p=25;
    *n=35;
    (*p)++;
    (*n)++;
    printf("a:%d, b:%d\n",a,b);
    n=p;
    printf("p'nin degeri: %u\n",p);
    printf("n'nin degeri: %u\n",n);
    printf("a'nin adresi: %u\n",&a);
    (*p)++;
    (*n)++;
    printf("a:%d, b:%d\n",a,b);
    return 0;
}
a:26, b:36
p'nin degeri: 4101352272
n'nin degeri: 4101352272
a'nin adresi: 4101352272
a:28, b:36
#include <stdio.h>
int main(){
    int a,b,*p=&a, *n=&b;
    *p=25;
    *n=35;
    (*p)++;
    (*n)++;
    printf("a:%d, b:%d\n",a,b);
    *p=*n;
    printf("p'nin degeri: %u\n",p);
    printf("n'nin degeri: %u\n",n);
    printf("a'nin adresi: %u\n",&a);
    printf("b'nin adresi: %u\n",&b);
    (*p)++;
    (*n)++;
    printf("a:%d, b:%d\n",a,b);
    return 0;
}
a:26, b:36
p'nin degeri: 4174330816
n'nin degeri: 4174330820
a'nin adresi: 4174330816
b'nin adresi: 4174330820
a:37, b:37

işaretçilerin fonksiyon argümanı olarak kullanılması

#include <stdio.h>
void ayristir(double sayi, int *tam_kismi, double *ondalik_kismi){
    *tam_kismi = sayi;
    *ondalik_kismi = sayi - *tam_kismi;
}
int main() {
    double sayi, ondalik;
    int tam;
    printf("ondalikli bir sayi giriniz:");
    scanf("%lf", &sayi);
    ayristir(sayi, &tam, &ondalik);
    printf("%lf sayisinin tam kismi %d ondalikli kismi %lf",
                                           sayi,tam, ondalik);
    return 0;
}
ondalikli bir sayi giriniz:

10.3

10.300000 sayisinin tam kismi 10 ondalikli kismi 0.300000
#include <stdio.h>
double ayristir(double sayi, double *ondalik_kismi){
    double tam;
    tam = (int)sayi;
    *ondalik_kismi = sayi - tam;
    return tam;
}
int main() {
    double sayi, ondalik;
    double tam;
    printf("ondalikli bir sayi giriniz:");
    scanf("%lf", &sayi);
    tam=ayristir(sayi, &ondalik);
    printf("%lf sayisinin tam kismi %lf ondalikli kismi %lf",
                                           sayi,tam, ondalik);
    return 0;
}
ondalikli bir sayi giriniz:

10.5

10.500000 sayisinin tam kismi 10.000000 ondalikli kismi 0.500000
# include <stdio.h>
void maks_min(int dizi[], int boyut, int *maks, int *min){
    int i;
    *maks=dizi[0];
    *min=dizi[0];
    for(i=1;i<boyut;i++){
        if(*maks<dizi[i])
            *maks=dizi[i];
        if(*min>dizi[i])
            *min=dizi[i];
    }
}
int main(){
    int a[]={1,4,2,1,0,9,4,5,8,0};
    int en_buyuk, en_kucuk;
    maks_min(a, sizeof(a)/sizeof(a[0]), &en_buyuk,&en_kucuk);
    printf("dizinin en buyuk elemani:%d\n",en_buyuk);
    printf("dizinin en kucuk elemani:%d",en_kucuk);
    return 0;
}
dizinin en buyuk elemani:9
dizinin en kucuk elemani:0
# include <stdio.h>
// eger a isaretcisi uzerinden parametere olarak gonderilen
// deger uzerinde herhangi bir degisiklik yapimasi istenmiyor ise
// void f(int *a) yerine asagidaki gibi kullanilir. 
void f(const int *a){
    *a=10;
}
int main(){
    int x=20;
    f(&x);
    return 0;
}
/tmp/tmp4iswptd2.c: In function ‘f’:
/tmp/tmp4iswptd2.c:6:7: error: assignment of read-only location ‘*a’
    6 |     *a=10;
      |       ^
[C kernel] GCC exited with code 1, the executable will not be executed
# include <stdio.h>
void yer_degistir(int *degisken1, int * degisken2){
   int temp;
    temp=*degisken1;
    *degisken1=*degisken2;
    *degisken2=temp;
}
int main(){
    int x=20,y=50;
    printf("x: %d, y:%d\n",x,y);
    yer_degistir(&x, &y);
    printf("x: %d, y:%d\n",x,y);
    return 0;
}
x: 20, y:50
x: 50, y:20
# include <stdio.h>
int *maks(int *a, int *b){
   if(*a>*b)
       return a;
    return b;
}
int main(){
    int x=60,y=50;
    int *p;
    p=maks(&x,&y);
    printf("buyuk olan:%d\n",*p);
    
    return 0;
}
buyuk olan:60
# include <stdio.h>
int *ortadakini_bul(int a[], int n){
    return &a[n/2];
}
int main(){
    int x[]={1,2,3,0,3,7,5};
    int *p;
    p=ortadakini_bul(x, sizeof(x)/sizeof(x[0]));
    printf("dizinin ortasindaki eleman:%d\n",  *p );
    
    return 0;
}
dizinin ortasindaki eleman:0