Рубрики

Разница между указателем и массивом в C?

Указатели используются для хранения адресов динамически размещаемых массивов и для массивов, которые передаются в качестве аргументов функциям. В других контекстах массивы и указатели — это две разные вещи, см. Следующие программы для обоснования этого утверждения.

Поведение размера оператора

С

// 1-я программа, показывающая, что массив и указатели разные
#include <stdio.h>

  

int main()

{

   int arr[] = {10, 20, 30, 40, 50, 60};

   int *ptr = arr;

     

   // выводится sizof (int) * (номер элемента в arr [])

   printf("Size of arr[] %ld\n", sizeof(arr));

  

   // размер указателя печатается одинаково для всех типов

   // указателей (char *, void * и т. д.)

   printf("Size of ptr %ld", sizeof(ptr));

   return 0;

}

C ++

// 1-я программа, показывающая, что массив и указатели разные
#include <iostream>

using namespace std;

  

int main() {

   int arr[] = {10, 20, 30, 40, 50, 60};

   int *ptr = arr;

     

   // выводится sizof (int) * (номер элемента в arr [])

   cout << "Size of arr[] "<< sizeof(arr)<<"\n";

  

   // размер указателя печатается одинаково для всех типов

   // указателей (char *, void * и т. д.)

   cout << "Size of ptr "<< sizeof(ptr);

   return 0;

}

Выход:

Size of arr[] 24
Size of ptr 8

Присвоение любого адреса переменной массива не допускается.

// Вторая программа, показывающая, что массив и указатели разные
#include <stdio.h>

  

int main()

{

   int arr[] = {10, 20}, x = 10;

   int *ptr = &x; // Это отлично

   arr = &x;  // Ошибка компилятора

   return 0;

}

Выход:

 Compiler Error: incompatible types when assigning to 
              type 'int[2]' from type 'int *' 

Смотрите предыдущий пост на эту тему для большего различия.

Хотя массив и указатель — разные вещи, следующие свойства массива делают их похожими.

  1. Имя массива дает адрес первого элемента массива.
    Рассмотрим следующую программу для примера.
    С

    #include <stdio.h>

      

    int main()

    {

       int arr[] = {10, 20, 30, 40, 50, 60};

       // Назначаем адрес массива для ptr

       int *ptr = arr;  

       printf("Value of first element is %d", *ptr);

       return 0;

    }

    C ++

    // 1-я программа, показывающая, что массив и указатели разные
    #include <iostream>

    using namespace std;

      

    int main() {

       int arr[] = {10, 20, 30, 40, 50, 60};

         

       // Назначаем адрес массива для ptr

       int *ptr = arr;  

       cout << "Value of first element is " << *ptr;

       return 0;

    }


    Выход:

    Value of first element is 10
  2. Доступ к членам массива осуществляется с помощью арифметики указателей.
    Компилятор использует арифметику указателей для доступа к элементу массива. Например, выражение типа «arr [i]» обрабатывается компилятором как * (arr + i). Вот почему выражения типа * (arr + i) работают для массива arr, а выражения типа ptr [i] также работают для указателя ptr. С

    #include <stdio.h>

      

    int main()

    {

       int arr[] = {10, 20, 30, 40, 50, 60};

       int *ptr = arr;

       printf("arr[2] = %d\n", arr[2]);

       printf("*(arr + 2) = %d\n", *(arr + 2));

       printf("ptr[2] = %d\n", ptr[2]);

       printf("*(ptr + 2) = %d\n", *(ptr + 2));

       return 0;

    }

    C ++

    #include <iostream>

    using namespace std;

      

    int main() {

       int arr[] = {10, 20, 30, 40, 50, 60};

       int *ptr = arr;

       cout << "arr[2] = "<< arr[2] <<"\n";

       cout << "*(arr + 2) = "<< *(arr + 2)<<"\n";

       cout << "ptr[2] = "<< ptr[2]<< "\n";

       cout << "*(ptr + 2) = "<< *(ptr + 2)<< "\n";

       return 0;

    }

    Выход:

    arr[2] = 30
    *(arr + 2) = 30
    ptr[2] = 30
    *(ptr + 2) = 30 
    
  3. Параметры массива всегда передаются как указатели, даже если мы используем квадратные скобки.

    #include <stdio.h>

      

    int fun(int ptr[])

    {

       int x = 10;

      

       // размер указателя печатается

       printf("sizeof(ptr) = %d\n", sizeof(ptr));

      

       // Это разрешено, потому что ptr - это указатель, а не массив

       ptr = &x;

      

       printf("*ptr = %d ", *ptr);

      

       return 0;

    }
    // Код драйвера

    int main()

    {

       int arr[] = {10, 20, 30, 40, 50, 60};

       fun(arr);

       return 0;

    }

    Выход:

    sizeof(ptr) = 8
    *ptr = 10

Пожалуйста, обратитесь к Pointer vs Array in C для более подробной информации.

Эта статья предоставлена Абхай Рати . Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме

Рекомендуемые посты:

Разница между указателем и массивом в C?

0.00 (0%) 0 votes