На этом шаге мы рассмотрим взаимосвязь указателей и массивов.
Продолжим рассмотрение нерегулируемых указателей. Интересно соотносятся между собой указатели и массивы.
Пусть имеем массив:
int А[10];
int pa;
После объявления значение указателя никак не определено, как не определено и значение любой переменной (под них компилятор только выделяет соответствующую память). Настроим указатель на массив А[]. Адрес первого элемента массива занесем в указатель:
pа=&А[0];
Как мы видели ранее, pa+i будет указывать на i-й элемент массива, т. е. можно достать такой элемент из массива путем выполнения оператора:
int a=*(pa+i);
Но по определению массива мы можем записать:
int a=A[i];
Мы говорили ранее, что массив элементов строится в языке С так, что его имя - это адрес первого элемента массива, в нашем случае А=&А[0] и pа=&А[0]. Следовательно:
pа = А pa + i = A + i *(pa + i) = *(A + i) = A[i]
Более того, хотя pа - это просто переменная, содержащая адрес, но когда она содержит адрес массива, то можно писать pа[i] = А[i], т. е. обращаться к элементам массива можно через индексированный указатель.
Пример программы, демонстрирующей вышесказанное, приводится ниже (все пояснения даны по тексту программы), результат работы программы - на рисунке 1. Заметим, что программа строится в среде CLR, хотя содержит нерегулируемые указатели.
// UkMas.cpp: главный файл проекта. #include "stdafx.h" #include <clocale> //обязательно для функции setlocale() #include <stdio.h> #include <conio.h> #include <stdlib.h> //atoi() #define eof -1 #define MAXLINE 1000 using namespace System; //--- Ввод строки с клавиатуры --- int getline(char s[],int lim) //здесь getline() изменена, чтобы //отлавливала <Ctrl+z> { int c, i; for(i=0; i<lim-1 && (c=getchar()) != eof && c != '\n'; i++) s[i]=c; if(c == eof) return -1; s[i] = '\0'; i++; //для учета количества return i; } int main() { setlocale(LC_ALL,"Russian"); //функция setlocale() с аргументами //для корректного вывода кириллицы int A[MAXLINE]={0,1,2,3,4,5,6,1,8,9}; //инициализация массива int *pa=&A[0]; //настройка указателя на массив char s[MAXLINE]; //для ввода номера элемента массив do //для обеспечения цикличности ввода номеров элементов { //запрос на ввод номера элемента printf("Задайте номер элемента <0-9> >"); getline(s, MAXLINE); //ввод номера элемента как строки символов int i=atoi(s); //преобразование номера элемента в число printf("i=%d A[i]=%d *(pa+i)=%d *(A+i)=%d %d\n", i, A[i],*(pa+i), *(A+i), pa[i]); } while (getline(s,MAXLINE) != eof); // для обеспечения цикличности ввода номеров элементов: // признак конца цикла ввода - Ctrl+z _getch(); //задержка изображения на экране return 0; }
Рис.1. Результат работы приложения
Дополнительную информацию по этому вопросу можно получить здесь.
На следующем шаге мы рассмотрим операции над указателями.