АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

УКАЗАТЕЛИ И МАССИВЫ

Читайте также:
  1. VI. Сигнальные указатели и знаки на транспорте
  2. Вопрос 50. Для чего применяются маршрутные световые указатели?
  3. Динамические массивы
  4. Идентификаторы, переменные, массивы
  5. Массивы и переменные с индексами.
  6. Массивы, векторы и матрицы
  7. Массивы.
  8. Многомерные массивы
  9. Последовательности, списки, множества. Массивы. Вектора.
  10. Световые указатели сохраняют сигнальные значения и в погашенном состоянии.
  11. СВОБОДНЫЕ МАССИВЫ И УКАЗАТЕЛИ
  12. Указатели

 

Между указателями и массивами существует прямая связь. Когда объявляется массив, например:

 

int arr [5];

 

то идентификатор массива arr определяется как константный указатель на первый (с индексом 0) элемент массива. Это означает, что имя массива содержит адрес элемента массива с индексом 0:

 

arr = &arr[0];

Так как идентификатор массива содержит адрес, то можно, например, записать:

 

int arr[ 5]; //объявление массива целых

 

int *parr; //объявление указателя на данное целого типа

 

parr = arr; // присваивавание указателю адреса первого элемента массива, то же, что

// и parr = &arr[0];

 

Связь между именем массива arr и указателем parr можно изобразить следующим образом:

 
 

 


arr[0] arr[1] arr[2] arr[3] arr[4]

 

Адрес элемента массива с индексом i может быть записан как

&arr[i], что эквивалентно записи parr+i

 

Значение элемента массива с индексом i может быть записано как

arr[i], что эквивалентно записи *(parr+i) или *(arr+i)

 

Все индексные выражения вида arr[i] компилятор преобразует к адресному представлению в соответствии с правилами выполнения операции сложения указателя с целой величиной:

 

arr[i]=*(arr+i) =* (arr + i * sizeof(int))

 

ВАЖНО.

Указатель – это переменная, и ее значение можно изменять в программе, например, можно записать:

 

parr++;

 

Операция parr++ означает сдвиг указателя на следующий элемент массива arr++, то есть на 2 байта. Если, например, до выполнения операции parr++ указатель был установлен на первый элемент массива, то в результате выполнения этой операции он окажется установленным на второй элемент:

 

 
 

 


arr[0] arr[1] arr[2] arr[3] arr[4]

 

 

Имя массива – константа. Значение адреса, которое хранит имя массива, изменять нельзя, поэтому ошибочной является следующая запись:

 

arr++;

 

 

Пример 4. Программа, в которой демонстрируется использование указателей на массив.

 

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <time.h>

 

#define N 100 //максимально допустимое количество элементов в массиве

 

int main(void)

{

int a[N]; /* резервирование памяти под N элементов массива */

int i; //переменная, управляющая циклом

int *pa=a; //объявление указателя на данное целого типа

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

 

clrscr();

randomize();

//цикл заполнения массива случайными числами

for(i=0; i<N; i++)

*(pa+i) = random(101)-50; // присваивание элементу массива значения случайного

// числа из диапазона от -50 до 50

 

//цикл вывода элементов массива

printf("\n\n Массив выведен по 10 элементов в строке \n\n");

 

for(i=0; i<N; i++)

{

printf("%6d ", *(pa+i)); // вывод массива

if(i%10==9)

printf("\n");

}

getch();

 

return 0;

}

 

 

Пример 4. Программа, в которой организован ввод элементов массива в диалоговом режиме и вывод полученного массива. Используется указатель на массив.

 

#include <stdio.h>

#include <conio.h>

 

void main(void)

{

int i;

int a[10]; //объявление массива целых из десяти элементов

int *pa = a; //объявление указателя на данное целого типа и инициализация указателя

// адресом массива

clrscr();

 

//цикл ввода элементов массива в диалоговом режиме

for(i=0; i<10; i++)

{

printf("\nВведите элемент массива с индексом %d ",i);

scanf("%d", pa+i); //функция scanf получает адрес элемента массива

}

 

printf("\n\n Вы ввели массив \n\n");

 

for(i=0; i<10; i++)

printf("%4d ", *(pa+i)); // вывод массива

 

getch();

 

}

 

 

Пример 5. Программа, в которой используются указатели на строки.

 

#include <stdio.h>

 

void main(void)

{

char s[]="строка как массив";

char *ps=s; //указатель ps инициализирован значением адреса строки s

char *ps1,*ps2,*ps3; //объявление указателей на строки

 

//присвоение указателю ps1 адреса строковой константы

ps1="В языке си в одну\n"

"строку можно записать\n"

"целое стихотворение\n";

 

//присвоение указателю ps2 адреса строковой константы

ps2="предложение не будет\

перенесено на следующую строку";

 

//присвоение указателю ps3 адреса строковой константы

ps3="одна"

" строка";

 

//цикл вычисления длины строки s, адрес которой хранит указатель ps

// выполнять, пока не найден конец строки

while(*ps!='\0')

ps++;

 

printf("длина строки= %d\n",ps-s);

 

puts(ps1);

puts(ps2);

puts(ps3);

}

 

 


1 | 2 | 3 | 4 | 5 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.009 сек.)