C Pointer

[code]#include <stdio.h> #include <stdlib.h> int arraySum(int array[], const int n){ int sum = 0, * ptr; int * const arrayEnd = array + n; printf("%p\n", array); // show 0028FEF8 printf("%p\n", &array); // show 0028FEE0 printf("------------------\n"); for(ptr = array; ptr < arrayEnd; ++ptr) sum += *ptr; return sum; } int main(){ int values[10] = { 3, 7, -9, 3, 6, -1, 7, 9, 1, -5 }; // but here same address show 0028FEF8 printf("%p\n",values); // show 0028FEF8 printf("%p\n",&values); //show 0028FEF8 printf("----------------------\n"); // printf("%p\n", ptr); printf ("The sum is %i\n", arraySum (values, 10)); return 0; }[/code] salam bu kodda əsas məqsədi başa düşmüşəm amma 1 az belə deyək oynadıgdan sonra kodnan belə 1 şey gördüm array və &array funksiyadan kənarda yəni main funksiyya daxilində eyni adresi gösdərir məsələn 0028FEF8 adresin(commentdə yazmışam) amma funksiyya daxilində (arraySum) fərqli məsələn array - 0028FEF8 &array - 0028FEE0 adreslərin gösdərillər bunun səbəbi nədi ? qabagcadan təşəkkürlər

Verilmiş cavablar və yazılan şərhlər (3 cavab var)

ahmed (2016-11-13 19:13:11)
Bunun üçün sistem proqramlaşdırmanı örgənmək lazımdır. Linux nüvə hakinq-dən başlaya bilərsiniz.

Till (2016-11-12 23:34:44)
Çox sağolun Əhməd müəllim izah üçün başa düşdüm hər dəfə kömək edirsiz təşəkkülər 1 də bu incə məqamlar kitablarda ən azınnan hələki oxuduğum kitabda yazılmır bunları mən necə örgənəcəm təcrübə etdikcə ya necə ?

ahmed (2016-11-12 20:57:14)
Salam. bu çətin sualdı. Bunu tam başa düşmək biraz təcrübə tələb edir. Bacardığım qədər izah eləməyə çalışacam. Burda iki sual bir - birinin içindədir: 1) Niyə values və &values eyni ünvanı çap edir. Axı biri göstərici, digəri göstəriciyə göstəricidi(ikiqat göstərici) 2) Sizin sual - niyə main -də ünvanlar eynidir, arraySum -da isə fərqli. 2-yə cavab vermək üçün əvvəl 1 -i başa düşməliyik. C-də adi dəyişən , 1qat və 2 qat göstəricilər olur. Misal üçün : [code] int x, *y, **z;[/code] Əslində isə bunların 3-ü də tam ədəddir, sadəcə kompilyator bilir ki x-ə yazılan məlumata ancaq qiymət, y-ə yazılan məlumata ancaq ünvan, z-tə yazılan məlumata ünvanın ünvanı kimi yanaşmaq lazımdır. Normalda bu 3 dəyişən yaddaşda int x,y,z; kimi yadda saxlanılır və onların hər birində 5, 12, 234 v.s. kimi ədədlər yerləşir. Ünvanda öz növbəsində bir ədəddir, tam ədəd. Array C-də const pointer -dir. Yəni pointerdi, sadəcə istinad etdiyi ünvan dəyişə bilməz. Buna görə onun qiyməti ilə ünvanı üst-üstə düşür. Keçək ikinci suala. burda diqqət eləsəz main -də value birbaşa çap olunur, amma arraysum -a parametr kimi ötürülür. Məsələ də elə bundadır. Funksiyaya ötürülən parametr əvvəlcə stekə yerləşdirilir. Funksiyanın daxilində ona ötürülən parametrin ünvanın çap eliyəndə o stekdəki ünvanı çap eliyir. Cərgələrin yaddaşda yerləşməsi, funksiyaya parametr ötürülməsi, stek v.s. ilə daha ətraflı Programming from ground up kitabından məlumat əldə edə bilərsiniz.