Указатели на одномерные массивы

Использование указателей для связи функций

Описание указателей

УКАЗАТЕЛИ

Память состоит из байтов, каждый из которых пронумерован, начиная с 0, 1, 2... Номер – это адрес. В Си есть переменные, которые могут содержать этот адрес – указатели и операция взятия адреса - &.

int var=1; - определение и инициализация переменной. var – её имя.

printf ("%d %d\n",var, &var); 1 12136

Машинный код команды можно выразить словами. "Выделить 2 байта памяти, присвоить им имя var. Поместить в ячейку с адресом 12136 число". Фактический адрес этой переменной 12136, а его символическое представление &var.

Значением переменной типа указатель служит адрес некоторой величины. Дадим имя этой переменной ptr; тогда можно написать ptr=&var;

В этом случае говорим "ptr указывает на var", где ptr-переменная, &var-константа.

ptr=# - теперь указывает на num.

13.1 Операция косвенной адресации *

Для доступа к переменной, адрес которой помещен в ptr, используется операция косвенной адресации.

val=*ptr; //val==num

*ptr = 10; //num==10

Мы уже знаем как описываются переменные, массивы. Как же описать указатель! Сложность в том, что переменные разных типов содержат разное число ячеек, но операции с указателями требуют знания отведенной им памяти. Поэтому, при определении указателя, мы описываем, на какой тип переменной она будет указывать, и что это указатель символ *.

int* ptr;

float* pmas;

char* pc;

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

void swap(int*,int*);

void main(void){

int x=5, y=10;

printf ("Прервичные значения х=%d, y=%d\n",x, y);

swap (&x, &y);

printf ("Новые значения х=%d, y=%d\n", x, y);

}

void swap (int*v, int*z){

int u;

u=*v;

*v=*z; //x=y

*z=u;

}

Мы передали в функцию адреса переменных, поэтому при выходе х, у имееют новые значения. При передаче значений этого не происходило.

Вызов swap (x, y); swap (&x, &y);

Определение функции swap (int v, int z); swap (int*v, int*z);

Переменные х, y являются локальными в функции main, но мы, таким образом, можем на них воздействовать в другой функции.

Указатели позволяют эффективно работать с массивами. Имя массива представляет собой скрытую форму указателя.

Mas -> &mas[0]; - определяется адрес 1-го элемента массива. Оба выражения являются константными выражениями и не меняются на протяжении работы программы. Их можно присваивать переменной типа указатель.

void main(void){

int dates [4], *pti, i;

float bills [4], *ptf;

pti=dates;

ptf=bills;

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

printf ("указатель +%d: %10u и %10u\n", i, pti+i; ptf+i);

}

Указатель +0: 56014 56026 - начало адреса массивов.

+1: 56016 56030

+2: 56018 56034

+3: 56020 56038

Прибавляя 1 к указателю, переходим к следующему элементу массива, а не к следующему байту, т.е. смещаемся на длину типа элемента массива.

рt pt+1 pt+2 pt+3

dates+2 <=> &dates[2]

*(dates+2) <=> dates[2]

*dates+2 <=> *(dates)+2

//Суммирование элементов массива с использованием указателя.

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

sum+=*(ptm+i);

или

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

sum+=*ptm;

ptm++;

}

или

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

sum+=*ptm++;


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: