سؤال

#include<stdio.h>
#include<conio.h>

float smallest(int arr[],int k,int n);
void sort(int arr[],int n);

void main()
{
 int arr[20],i,n,j,k;
 clrscr();
 printf("\nEnter the number of elements in the array: ");
 scanf("%d",&n);

 printf("\nEnter the elements of the array");
 for(i=0 ; i < n ; i++)
 {
  printf("\n arr[%d] = ",i);
  scanf("%d",&arr[i]);
 }

 sort(arr,n);
 printf("\nThe sorted array is: \n");
 for(i=0 ; i < n ;  i++)
 printf("%d\t",arr[i]);
 getch();
}

int smallest(int arr[],int k,int n)//smallest function
{
 int pos=k,small=arr[k],i;
 for(i=k+1;i<n;i++)
 {
  if(arr[i]<small)
  {
   small=arr[i];
   pos=i;
  }
 }
 return pos;
}


void sort(int arr[],int n)//sorting function
{
 int k,pos,temp;
 for(k=0 ; k < n ; k++)
  {
   pos=smallest(arr,k,n);
   temp=arr[k];
   arr[k]=arr[pos];
   arr[pos]=temp;
  }
}

في البرنامج أعلاه يتم استدعاء وظيفة الفرز من الرئيسي ولكن نوع الإرجاع sort هو باطل وأنه لا يزال يعود مجموعة فرزها.كما هو الحال بعد فرز المصفوفة ، يجب أن تعيد الوظيفة المصفوفة المصنفة مرة أخرى إلى وظيفة الاتصال لطباعة المصفوفة المصنفة ولكن البرنامج يعمل بشكل مثالي.كيف يحدث ذلك?

هل كانت مفيدة؟

المحلول

عندما تعلن

int arr[20];

يمكنك أن تقول"أر هو مجموعة من 20 الأعداد الصحيحة".ولكن أر هو مؤشر إلى عدد صحيح أيضا ، مشيرا إلى عدد صحيح الأول في صف من 20.لذلك إلغاء الرجوع *arr هو عدد صحيح ، وهو نفس arr[0] في الواقع.

هذا يعني عندما تمر arr إلى وظيفة تقوم فقط بتمرير مؤشر إلى تلك الوظيفة.تعمل الوظيفة في هذه الحالة على المؤشر (المنسوخ).ولكن هذا المؤشر جدا يشير بالضبط إلى نفس الذاكرة كما الأصلي الخاص بك arr أعلن في main().وهذا هو السبب في التلاعب arr في sort() هو في الواقع التلاعب arr في main().

نصائح أخرى

عند تمرير صفيف كمعلمة ، هذا

int smallest(int arr[],int k,int n)

يعني بالضبط نفس

int smallest(int *arr,int k,int n)

على سبيل المثال

#include<iostream>
void printArray(int data[])
{
  for(int i = 0, length = sizeof(data); i < length; ++i)
  {
    std::cout << data[i] << ' ';
  }
  std::cout << std::endl;
}

int main()
{
  int data[] = { 5, 7, 8, 9, 1, 2 };
  printArray(data);
  return 0;
}

سترى أن تتم طباعة فقط 4 عناصر الأولى من مجموعة.ال sizeof(data) إرجاع قيمة 4!يحدث أن يكون حجم المؤشر المستخدم لتمرير المصفوفة إلى printArray().أولا لا يتم نسخ المصفوفة.يتم نسخ المؤشر إلى العنصر الأول من المصفوفة

أولا ، لا يوجد اتصال بين أي وسيطة دالة ما هو ، أو لا يتم تمريره باستخدام ملف return بيان مع تعبير وفقا لنوع إرجاع الدالة.

في حين أنه من الصحيح أن كل المعلمة التي تمر في ج هي بالقيمة-انسخ القيمة إلى "متغير المعلمة المحلي" - لا يفترض أي شيء حول ما سيحدث في موقع الذاكرة أ المؤشر هو الرجوع.لذلك ، يمكن للدالة إجراء أي تغييرات في بيئة الاتصال ، حتى بدون إرجاع قيمة.

فيما يتعلق بالمعلمات المعلنة على أنها aType name[].هذا مجرد سكر نحوي لـ const aType* name.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top