الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

سؤال في العمليات على المؤشرات

بدأه mhewedy في 22 يونيو 2010 · 3 رد · 369 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

كيف الحال يا إخوه

عندي مشكله في العميات على المؤشرات و أريد توضيحها لو سمحتم:

#include <stdio.h>
#include <stdlib.h>

void reverse(char*, char*);

int main(void){

	char* from = "hello";
	char* to = malloc(sizeof(char*));

 	printf("MAIN start: %p\n", to);
 	reverse(from, to);
 	printf("MAIN end: %p\n", to);

 	getchar();
 	return 0;
}
void reverse(char* str, char* ret){
 	printf("FUN start: %p\n", ret);	 
 	ret++;
 	printf("FUN end: %p\n", ret);	 
}

و الناتج هو:

MAIN start: 003E3E00
FUN start: 003E3E00
FUN end: 003E3E01
MAIN end: 003E3E00

و السؤال هو, لماذا عندما جعلت المؤشر يشير إلى خانة الذاكره التالية في الدالة reverse لم يؤثر ذلك على المؤشر الذي بال main , هل هذا له علاقة بال call by value ؟

نرجو الإفاده

#2

شكرا لكم, لقد عرفت لم المؤشر بالدالة main مازال يشير على المكان الإبتدائي له في الذاكره:

#include <stdio.h>
#include <stdlib.h>

void reverse(char*, char*);

int main(void){
	char* str1 = "hello";
	char* str2 = str1;

	printf("%p %p\n", str1, str2);
	str1+=10;
	printf("%p %p\n", str1, str2);	

	getchar();
	return 0;
}

فأنا أقول إجعل س يشير للعنوان 1 , و إجعل ص يشير لنفس العنوان الذي يشير إليه س

ثم إجعل ص يشير إلى العنوان التالي, و من ثم أوجد قيمة العنوان الذي يشير إليه س,,

بالطبع المؤشر س لم يتغير من مكانه, لذا سأجده مازال يشير مكانه الأصلي

لكن كيف أغير مكان المؤشر س إذا تغير مكان المؤشر ص ؟؟

تم تعديل هذه المشاركة بواسطة هويدي في 22 يونيو 2010 في 12:46

#3

مرر بالمرجع او مرر عنوان المؤشر نفسه .

void reverse(char* str, char** ret){
    	printf("FUN start: %p\n", *ret);
    	(*ret)++;
    	printf("FUN end: %p\n", *ret);
}

void reverse(char* str, char* &ret){
    	printf("FUN start: %p\n", ret);  
    	ret++;
    	printf("FUN end: %p\n", ret);	
}
2

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#4

شكرا أخي :

#include <stdio.h>
#include <stdlib.h>

void fun(char** str);

int main(void)
{
	char* str = "helloWorld";
	printf("%p \n", str);
	fun(&str);
	printf("%p \n", str);
	return 0;
}

void fun(char** str)
{
	printf("%p \n", ++(*str));
}

و كأننا نقول:

char* str = ....
char** str_ptr = &str;

++(*str_ptr)

جزاكم الله خيرا

تم تعديل هذه المشاركة بواسطة هويدي في 22 يونيو 2010 في 18:16

مواضيع مشابهة