עבור לתוכן

לא מבין משהו במערך CHARים, בC

Featured Replies

פורסם

מערך הוא פוינטר לכל דבר. אין לו הגבלות.

אפשר לעשות ככה:

int c[10];
*c = 1;

וזה שקול לקוד הבא:

int c[10];
c[0] = 1;

הביטוי הזה:

c[i];

זהה לביטוי הזה:

*(c+i)

  • תגובות 50
  • צפיות 5k
  • נוצר
  • תגובה אחרונה
פורסם
  • מחבר

אבל אם אתה מגדיר מערך בגודל 10 ומנסה להכניס ערך ל15 זה לא יעבוד...

פורסם

תגדיר "לא יעבוד".

הקומפיילר לא יצעק עליך (אולי, אם הוא מספיק חכם, הוא יזהיר אותך שיכול להיות שאתה חורג מגבולות המערך).

כשתריץ את התכנית היא תעשה בעיות, בגלל ה-buffer overflow.

פורסם
  • מחבר

כן נו... זאת הייתה הכוונה שלי ב"הגבלות"...

פורסם

מערך הוא פויינטר מוגבל. בעצם המערך מכיל כתובת בזכרון לתא הראשון במערך = אותו דבר כמו פוינטר ( מכיל כתובת) ההבדל הוא שבפויינטר רגיל אתה יכול לשנות את הכתובת שאותה הוא מכיל => לגרום לו להצביע לכתובת אחרת בזכרון. במערך אתה לא יכול לעשות את זה. הכתובת נקבעת בזמן ההקצעה הסטטית ולא ניתנת לשינוי במהלך התוכנית. כל שאר שיטות הגישה זהות לפויינטרים ולמערכים( בגלל ששניהם בעצם פוינטרים).

פה בעצם "ההגבלה" של המערך ( אי יכולת לשנות את הכתובת אליה הוא מצביע בזמן הריצה).

בקשר לגלישת זכרון, זה יכול לקרוא גם במערך וגם בפויינטר רגיל. שגיעת קומפילציה זה לא יתן. או שתקבל באג לא מובן, אבל סביר להניח שתקבל שגיעת זמן ריצה.

זה לא קשור להגבלות, ככה פויינטרים עובדים ב C, ו האופרטור [] מוגדר לעבוד בצורה מסויימת וככה הוא ימשיך לעבוד. אתהזה שצריך לוודע שאין לך גלישה או פנייה לכתובת לא חוקית.

http://www.eskimo.com/~scs/cclass/notes/sx10b.html

http://www.cs.umd.edu/class/spring2003/cmsc311/Notes/BitOp/pointer.html

השורה *C++ תנסה לקדם את הכתובת ששמורה ב C, אם C הוא מערך סטטי את תקבל שגיעה כי לא ניתן לשנות כתובת ששמורה במערך סטטי. בפויינטר רגיל זה אפשרי.

פורסם

ב C מערך הוא בעצם פוינטר קבוע?

או במילים אחרות

char s[1];

שקול ל:

char c;
const char *s = &c;

?

פורסם

לא.

מה שרשמת בשורה השנייה זה לא מצביע "קבוע"/סטטי אלה מצביע לקבוע. כלומר אתה יכול לשנות את הכתובת ש s מכיל, אבל לא ניתן לשנות את ערך התא שאליו הוא מצביע.

במערך זה ההפך, ניתן לשנות את ערכי התאים. אבל לא ניתן לשנות את הכתובת שהמערך מכיל( כתובת התחלת המערך).

הגדרה של פויינטר קבוע( ניתן לשנות ערך של התא אליו מצביע, אבל לא ניתן לשנות את הכתובת שאותה הוא מכיל):

int i=17;
int* const p1 = &i;
*p1 = 29;

פורסם

ומה שרשמת עכשיו שקול ל

int i[1] = {17};
*i = 29;

?

ובשורה

int* const p1 = &i;

אפשר להצמיד את הכוכבית ל const (משמאל) מבלי שתשתנה המשמעות? אם לא אז לאיפה כן?

פורסם

בקשר לחלק הראשון - כן.

לא הבנתי את השאלה שנייה שלך.

פורסם

Jaman - אם אני מבין אותך נכון, אז אתה מתכוון האם זה:

int* const p1 = &i;

שקול לזה:

int *const p1 = &i;

ולמיטב ידיעתי, התשובה היא כן.

פורסם

כן, זה מה שהתכוונתי אליו. תודה על התשובות של שניכם :).

פורסם
  • מחבר

אתם יודעים עדין עם PUTS וGETS זה נותן לי להכניס יותר (ברור שהכוונה היא שהוא גם מכניס יותר).

עריכה:

או שאני לא משתמש טוב בGETS?

אני עושה ככה

gets(x);

פורסם

תנסה

char a[4];

scanf("%3s", a);

פורסם
  • מחבר

סבבה, עובד.

אבל לא נראה לך פתרון די דבילי? כאילו אין פונקצית קליטה נורמלית או שהם רק בC++?

נוצרו לי עוד שאלות

למה אני לא יכול לרשום CLRSCR(); לפני הגדרת המשתנים(אה, זה בגלל שההגדרה חייבת להיות ראשונה?)?

ויש לי שאלה שהולכת ככה

לכתוב רקורסיה שמקבלת מחרוזת ומדפיסה את כל התווים שהקוד אסקי שלהם קטן יותר משל התו האחרון. הפונקציה לא מחזירה כלום.

עכשיו פתרתי את זה רק עם STRLEN, יש דרך בלי?

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים