Унарные операции изменения значения указателя
Тема № 4. Организация данных. Массивы и указатели
int Array[10]; // Массив из десяти целых чисел
double D_array[1000]; // Массив из 1000 действ-х чисел
char Buffer[80]; // Массив из 80 байтов
int Arr[3];
Arr[0], Arr[1], Arr[2]
//*************** Middle project
#include <stdio.h>
#include <conio.h>
Int main()
{
int Arr[10];
Int i, m;
for (i = 0; i < 10; i++) {
scanf("%d", &Arr[i]);
}
m = 0;
for (i = 0; i < 10; i++) {
m += Arr[i];
}
printf("Result = %10.5lf", (double)m /10.0);
Getch();
Return 0;
}
int matrix[10][20]; // Определение матрицы 10´20
double points[50][50][50]; // Координаты точек
//** Подсчет суммы элементов матрицы
#include <stdio.h>
#include <conio.h>
Void main()
{
Int i,j;
int matrix[3][4];
double sum = 0;
for (i = 0; I < 3; i++) // Input elements
for (j = 0; j < 4; j++)
scanf("%d", &matrix[i][j]);
for (I = 0; I < 3; i++) // Calculation
for (j = 0; j < 4; j++)
sum +=(double)matrix[i][j];
printf("Sum = %10.0lf", sum); //Output result
Getch();
}
int matr [2][3];
matr[0][0] : matr[0][1] : matr[0][2] : matr[1][0] : matr[1][1] : matr[1][2]
Инициализация массивов
double seq [] = {1.0, 2.1, 3.2, 4.3, 5.0};
seq[0]=1.0 seq[1]=2.1 seq[2]=3.2 seq[3]=4.3 seq[4]=5.0
int seq[4] = {1, 2};
определены только seq[0] = 1 и seq[1] = 2
элементы seq[2] и seq[3]останутся неопределенными.
int matr[3][2] = {{2,3}, {4,5}, {6,7}};
matr[0][0]=2 matr[0][1]=3 matr[1][0]=4 matr[1][1]=5 matr[2][0]=6 matr[2][1]=7
int matr[3][2] = {2, 3, 4, 5, 6, 7};
double M[4][6] = {{1.0}, {2.2}, {44.2}, {8.0} };
- начальные значения получат элементы только первого столбца матрицы M.
char str [6] = {‘h’, ‘e’, ‘l’, ‘l’, ‘o’, ‘\0’};
То же самое можно записать как
char <имя_массива> [размер] = “строка”;
char str [6] = “hello”;
Указатели
|
Адреса | Содержимое | |
0x0012ff50 | ‘A’ | Переменная Symbol |
0x0012ff51 | ‘B’ | |
0x0012ff52 | ‘C’ |
double *pVal, Value;
int *pNum0, *pNum1;
long *plVal;
char *pNum0,
z1, z2, z3, *pVal,
Mas[4] = {'A', 'B', 'C'};
pNum0 = NULL;
pNum0 = &Mas[0];
z1 = *pNum0;
pVal = &(*pNum0);
z2 = *(++pNum0);
pNum0 += 1;
z2 = *pNum0;
if (pNum0 == pVal)
x = *pNum0++;
z1 = *pNum0;
int x=100, y = 99, *pNum0; // pNum0 - указатель
pNum0 = &x; // pNum0 = 0x0012fec3 - адрес в памяти
y = *pNum0; // y = 100 - поменяло значение
(для void *pAdr объект по адресу pAdr не определен).
double *pVal, Value;
. . .
pVal = &Value;
int *pNum;
Float Number;
Number = 10.5;
pNum = &Number; ошибка!
double *pVal, Value;
. . .
pVal = NULL; // pVal = 0x00000000
1 – присваивание // pNum0 = &Mas[0]
2-получение значения объекта, на кот.ссылается указатель//z1=*pNum0;
3 - получение адреса самого указателя // &pNum;
4-унарные операции изменения значения указателя/pNum0;pNum0++;
5 - аддитивные операции // pNum0 += 1;
6 - операции сравнения // if (pNum0 == pVal)
Присваивание
int *pDat, *pDO, Date = 2003, DateOld=1997;
pDat = &Date; pDO = &DateOld; //Адрес переменной
pDat = pDO; // Указатель
pDO = NULL; // Спец. значение
Как и для обычных переменных допустимо «приведение типа»:
int *pI;
char *pC;
. . .
pC = (char *)pI; // Преобразование указателей
Получение значения того объекта, на который ссылается указатель
Получение адреса самого указателя
char c_Sym = ‘B’;
char *p_Sym;
*p_Sym – объект,
Указатель адресуемый
P_Sym указателем p_Sym
|
|
&p_Sym
*p_Sym - объект, находящийся по адресу p_Sym
*p_Sym – объект,
Указатель адресуемый
p_Sym = &c_Sym указателем p_Sym
|
|
&p_Sym
X0012ff6с 0x0012ff50
char **t; // переменная t - указатель на указатель символа
унарные операции изменения значения указателя
sizeof(<тип данных>)
Для char – 1, для short – 2, для long – 4 и т.д.
char : байт байт байт байт байт
short: байт байт байт байт байт
float: байт байт байт байт байт
int x[4],*p, n;
p = &x[0]; // p равно адресу 1-го эл-та массива x- &x[0]
n = *p++; // p равно а0x0064fdc8
n = *p++; // p равно а0x0064fdcc
n = *p++; // p равно а0x0064fdd0
Аддитивные операции
sizeof(<тип данных>)