Шаг 53.
Microsoft Visual C++ 2010. Язык С/С++.
Указатели и структуры данных. Указатели и массивы

    На этом шаге мы рассмотрим взаимосвязь указателей и массивов.

    Продолжим рассмотрение нерегулируемых указателей. Интересно соотносятся между собой указатели и массивы.

    Пусть имеем массив:

  int А[10];
и указатель, указывающий на какой-то объект типа int:
  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а[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. Результат работы приложения

    Дополнительную информацию по этому вопросу можно получить здесь.

    На следующем шаге мы рассмотрим операции над указателями.




Предыдущий шаг Содержание Следующий шаг