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

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

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.

// 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.

z4

struct data *wsk;

wsk->miesiac=12

A tak nie zadziała ?

// edit

@down dzięki ;]

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.

to zad 4 dobrze zrobiłem ?

Tak.

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

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

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

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

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.

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';

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;

}

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

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

Dla tego istnieją dwa różne operatory:

referencja.skladowa

wskaznik->skladowa