#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;
}
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)
1
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 :
Ə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.
0
Ç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ə ?
0
Bunun üçün sistem proqramlaşdırmanı örgənmək lazımdır. Linux nüvə hakinq-dən başlaya bilərsiniz.
Sual verin
Cavab verin