יום רביעי, 14 בדצמבר 2016

שפת C - הקצאת זיכרון דינאמי (יום רביעי)

הקצאת זיכרון דינאמי

נדגים מה הצורך בזיכרון דינאמי:

void main(){   
int n;               
scanf(%d,&n);
int A[n];         

הפקודה האחרונה לא חוקית!
למה?
* אסור שגודל מערך יהיה משתנה.
*אסור להגדיר משתנים אחרי שכבר כתבנו פקודות בתוכנית.

לכן יש שימוש בהקצאת זיכרון דינאמית!



- הקצאת זיכרון דינאמית היא האפשרות לייצר זיכרון (להקצות) במהלך ביצוע התוכנית.
- יש לעשות שימוש בספרייה  <stdlib.h>


אנחנו נשתמש בפקודות הבאות:

malloc - לבצע הקצאה חדשה
calloc  - לבצע הקצאה חדשה + לאפס אותה
realloc - להגדיל/להקטין זיכרון דינאמי
free     -  לשחרר זיכרון דינאמי

יום שני, 12 בדצמבר 2016

תירגול מצביע למערך

תרגיל:
כתוב פונקציה שמקבלת מערך של intים, את הגודל שלו, ומצביע לint כלשהו.
בדוק האם המצביע מצביע לאיבר כלשהו במערך.

אם כן: הדפס את כל האיברים במערך שנמצאים אחרי המצביע (כולל המצביע).
אם לא: הדפס "NO".







פתרון אפשרי:

יום ראשון, 11 בדצמבר 2016

שפת C - עוד על מצביעים (יום רביעי וראשון)

עוד על מצביעים:

- שם מערך הוא למעשה גם מצביע, שמצביע על הבית הראשון של האיבר הראשון במערך.

- כדי להצביע על מערך אפשר לעשות בפשטות (כש p הוא מצביע):
p = &A[0];  
  אבל אפשר לעשות גם:
.שכן שניהם מצביעים, ואפשר להשוות שני מצביעים-         p = A;  



- כל ערך שמוסיפים למצביע, ערך זה מייצג את כמות האיברים שרוצים להתקדם, ולא כמות הבתים.
  לדוגמה:
  אם p הוא מצביע מסוג int שמצביע על האיבר הראשון של המערך A
*p = 13;          =>      A[0] = 13
p++;               =>      p = 1004
*p = 27;          =>      A[1] = 27
p+=2;             =>      p = 1012
*p = 20;          =>      A[3] = 20