Указатели и структуры данных. Указатели и массивы

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

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

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

  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а - это просто переменная, содержащая адрес, но когда она содержит адрес массива, то
можно писать 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. Результат работы приложения

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

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



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий