[C] kilka zadań z wskaźników i struktur


(Vion91) #1

Witam

Przygotowuje się do egzaminu i mam kilka wątpliwości do zadań. Proszę o pomoc.

zad1

zdefiniowano funkcje

float *fun(float, int*) { ... }

A. zdefiniuj wskaźnik do tej funkcji: B. wywołaj funkcję wykorzystując wskaźnik, dokonaj deklaracji niezbędnych do jej wywołania: MOJA ODPOWIEDŹ

float*(*wsk)(float, int*)=fun;

int x;

wsk(6.5, &wsk)

Czy dobrze to zrobiłem ? Czy nie powinno być czasami int *x, zamiast int x? zad2 zadeklaruj zmienna typu osoba i nadaj wartosci polom: rok, imie_nazwisko, pensja:

struct data{int dzien, miesiac, rok;};

struct dane{char imie_nazwisko[40]; struct data ur;}

struct osoba{struct dane pracownik; long pensja;};

MOJA ODPOWIEDZ

struct osoba zad2;

zad2.pracownik.ur.rok=2011;

zad2.pracownik.imie_nazwisko=''Jan Kowalski'';

zad2.pensja=3500;

Gdzie popełniłem tutaj bład? zad3 Ustal wartosc zmiennej x i y dla ktorych petla sie wykonuje

while (!(x) || (y-5))

wiem, że pętla wykona się x=0, ale nie wiem co z y? zad4 Zdefiniowano typ:

struct data {

int miesiac,dzien, rok

zadeklaruj wskaźnik do struktury data i napisz fragment programu który przypisze skladowej miesiac wartość 12. MOJA ODPOWIEDŹ

struct data zad4;

struct data *wsk;

wsk=&zad4;

wsk->miesiac=12

Czy to jest poprawna deklaracja ? zad5 Czy poniższy fragment programu spowoduje wydruk tekstu "warunek spełniony". Uzasadnij

int d=0;

int z=0;

if (z<0 || z++ || ++d) printf("warunek spelniony");

Wiem, że ten kod wyświetli ten napis ale nie wiem dlaczego skoro w pierwszym warunku będzie 0<0. Wiem co robi z++ i ++d, ale nie wiem jaki to ma wpływ na ten warunek.

zad6


(Ziom32) #2

Operatory ++ mają wyższy priorytet niż operator alternatywy ||. Wartością ++d będzie zatem 1. Wartością obu wyrażeń: z<0 i z++ będzie nadal 0, ale to nie ma znaczenia w alternatywie(wystarczy, że jeden z warunków jest spełniony) i napis się wyświetli.


(Sawyer47) #3
// 1

wsk(6.5, &x);


// 2

strcpy(zad2.pracownik.imie_nazwisko, "Jan Kowalski");


// 3 

y różne od 5, bo inaczej całe wyrażenie też będzie zerem.

(Drobok) #4

z4

struct data *wsk;

wsk->miesiac=12

A tak nie zadziała ?

// edit

@down dzięki ;]


(Sawyer47) #5

Nie, drobok. Rezerwujesz pamięć na wskaźnik, ale on sam na nic sensownego nie wskazuje, piszesz po nieznanym miejscu w pamięci → naruszenie ochrony pamięci.


(Vion91) #6

to zad 4 dobrze zrobiłem ?


(Sawyer47) #7

Tak.


(Vion91) #8

a dlaczego użyłeś strcpy? a te moje przypisanie jest błędne ?


(Sawyer47) #9

W C(++) nie ma przypisywania tablic, można przypisać ich elementy (tutaj - char) i to właśnie robi strcpy.


(Vion91) #10

a w tym przypadku dla jakich wartości x pętla się wykona?

while((x-21) && !x) {}

(Sawyer47) #11

A jakieś własne typy? Bo co tu jest takiego trudnego - działanie operatora &&, ! czy co? Pętla się wykona jeśli wartość warunku będzie różna od zera.


(Vion91) #12

a co gdy mam nadać wartości polom z użyciem wskaźnika ?

struct punkt {

int x,y;

char opis[12];

};

struct punkt zad;

struct punkt *wsk;

wsk=zad;

wsk->x=1;

wsk->y=2;

wsk->opis[12]='napis';

(Sawyer47) #13

Dokładnie to samo, strcpy, tutaj wskaźnik na strukturę nie ma znaczenia w kontekście strcpy. Po drugie, wieloliterowe napisy ujmuje się w cudzysłowy, nie w apostrofy! Powinno być "napis". Po wtóre, zapomniałeś operatora adresu przy przypisaniu do wskaźnika. Polecam formatować ładnie kod, spacje między operatorami wpływają na czytelność.

Pisząc wsk->opis[12] chcesz dostać się do adresu spoza tablicy (bo ta ma tylko 12 elementów, indeksowanych od 0 do 11, poważny błąd).

#include 


struct punkt {

	int x,y;

	char opis[12];

};


int main (int argc, const char *argv[])

{

	struct punkt zad;

	struct punkt *wsk;

	wsk = &zad;

	wsk->x = 1;

	wsk->y = 2;

	strcpy(wsk->opis, "napis");


	return 0;

}

(Vion91) #14

A czy nazwa struktury nie jest jej adresem ?Tak samo jak tablicy i funkcji ?


([alex]) #15

Nazwa struktury nie jest jej adresem, nazwa struktury jest referencją do tej struktury.

Dla tego istnieją dwa różne operatory:

referencja.skladowa

wskaznik->skladowa