Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
NOMAD123
0 / 0 / 0
Регистрация: 29.03.2013
Сообщений: 4
#1

Подскажите пожалуйста, я тут новенький в чем ошибка? - C++

29.03.2013, 18:44. Просмотров 336. Ответов 3
Метки нет (Все метки)

"int main (void){int х, *р; х = 10; *р = х;return 0;}" Я долгое время не как не пойму... У казатель "р" не получает адреса, как мне кажеться..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.03.2013, 18:44
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Подскажите пожалуйста, я тут новенький в чем ошибка? (C++):

Подскажите в чем тут ошибка - C++
#include "stdafx.h" #include <iostream> #include <math.h> using namespace std; void main() {cout<< "Hello, student"<<endl; ...

Подскажите в чем тут ошибка, не идет компиляция - C++
#include "stdafx.h" #include <iostream> #include <math.h> using namespace std; void main() {cout<< "Hello, student"<<end; ...

подскажите пожалуйста в чем ошибка) - C++
при написании программы вылезла ошибка "...Возможно, вы забыли добавить директиву "#include "stdafx.h"" в источник" - добавил #include...

Пожалуйста, подскажите в чем у меня ошибка? - C++
У меня вот такая задача: "Дана символьная матрица размера 4 х 5. Из последовательности её строк сформировать новую строку и определить ее...

подскажите пожалуйста, в чем моя ошибка? - C++
подскажите пожалуйста, в чем моя ошибка? надо определить точки принадлежащие и не пренадлежащие темной фигуре... ...

Подскажите пожалуйста в чем ошибка?(С++,структуры,стек) - C++
Подскажите пожалуйста, в чем ошибка При считывании из файла единственной записи 5группа "Anokhin Viktor petrovich 4 5 ...

3
Friday
ну и долго меня небыло...
61 / 57 / 8
Регистрация: 24.03.2013
Сообщений: 173
29.03.2013, 18:48 #2
Кликните здесь для просмотра всего текста
Указатель – это переменная, хранящая адрес некоторого данного (объекта).
Память компьютера делится на 8-битовые байты. Каждый байт пронумерован, нумерация байт начинается с нуля. Номер байта называют адресом; об адресе говорят, что он указывает на определенный байт.

Таким образом, указатель является просто адресом байта памяти компьютера.

Использование указателей в программах на С позволяет:

1. Упростить работу с массивами;
2. Распределять память под данные динамически, то есть в процессе исполнения программы;
3. Выполнить запись и чтение данных в любом месте памяти.

Значение указателя сообщает о том, где размещен объект.

Объявление указателей

Указатели, как и другие переменные, должны быть объявлены в программе. При объявлении указателя перед его именем ставится *. В общем случае объявление переменной – указателя имеет вид:

класс памяти тип * имя ;

• означает “указатель на “.

Например,
Код C++
1
int * iptr;

iptr - это указатель на объект типа int. Этим объектом может быть простая переменная, типа int, массив элементов типа int или блок памяти, полученный, например, при динамическом распределении памяти.

Другие примеры объявления указателей:

Код C++
1
2
3
static float *f;
extern double *z;
extern char *ch;

Каждое из этих объявлений выделяет память для переменной типа указатель, но каждый из указателей пока ни на что не указывает

До тех пор, пока указателю не будет присвоен адрес какого – либо объекта, его нельзя использовать в программе.

Для получения адреса какого – либо объекта используется операция &. Эта операция позволяет присваивать указателям адреса объектов. Например:

Код C++
1
2
3
4
int a, *aptr;
char c, *cp;
aptr=&a;
cp=&c;

Доступ к объекту через указатель
Выполняется с помощью унарной операции *. Операция * называется операцией разадресации или операцией обращения по адресу. Операция * рассматривает свой операнд как адрес некоторого объекта и использует этот адрес для выборки содержимого. Другими словами, * означает “извлечь содержимое по адресу, на который указывает указатель.”
Для вывода адреса памяти, содержащегося в указателе, необходимо использовать спецификацию формата %p Значение адреса выводится в шестнадцатеричной системе счисления.

Пример 1. Программа, выводящая значение указателя и значение объекта, на который он указывает.

Код C++
1
2
3
4
5
6
#include <stdio.h>
void main (void) { int x, *px;
px=&x;
x=35;
printf("адрес x: %p\n",&x); printf("Значение указателя: %p\n",px);
printf("Значение х: %d\n",x); printf("Значение, адресуемое указателем: %d\n",*px); }

Эта программа выводит следующее:
адрес x: FFF4
Значение указателя: FFF4
Значение х: 35
Значение, адресуемое указателем: 35

Связь между переменной х и указателем px схематично показана на рисунке1.

Переменная-указатель px Переменная х

Унарная операция разадресации * может быть использована в левой части оператора присваивания, чтобы какие-то данные были запомнены в области памяти, на которую указывает указатель. Например:

Код C++
1
2
float y, *py =&y;
*py= -1.2;

Здесь *py= -1.2 означает присвоение значения –1.2 по адресу, хранящемуся в указателе, то есть, то же, что и y = -1.2;

Инициализация указателей

Следует избегать использования в программе неинициализированных указателей. Всегда должен существовать объект, адрес которого содержит указатель. При этом указатель всегда должен указывать на объект того же типа, с которым он объявлен.
Примеры:

Правильно Не правильно





Ошибка заключена в том, что указателю на данное целого типа присваивается адре переменной вещественного типа, а это не допустимо.

Указатель на неопределенный тип

Существует специальный тип указателя, называемый указателем на неопределенный тип. Объявление такого указателя имеет вид:

void * имя;

Например, Код C++
1
void *ptr;

Служебное слово void в объявлении указателя позволяет отсрочить определение типа объекта, на который он указывает.
Указатель на тип void может быть использован для ссылки на объект любого типа. Но для того, чтобы оперировать таким указателем в программе, необходимо явно задать тип в каждой операции с указателем. Для этого следует использовать операцию приведения типа указателя:
(тип *) указатель

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

Код C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
void main (void)
{
int a =123;
double d= 3.45678;

// объвление указателя на неопределенный тип
void *vp;

//указатель на неопределенный тип инициализирован адресом объекта целого типа
vp=&a;
//перед выводом значения объекта целого типа , адресуемого указателем vp,
// тип указателя явно приводится к целому
printf("a=%d \n", *((int *)vp));
//указатель на неопределенный тип инициализирован адресом объекта типа double
vp=&d;
//перед выводом значения объекта типа double , адресуемого указателем vp,
// тип указателя явно приводится к типу double
printf("d=%lf \n", *((double *)vp));

}


Эта программа выведет следующее:

a=123
d=3.456780

Следует отметить, что в программе, показанной в примере 2, ни одна операция не может быть выполнена над указателем vp до тех пор, пока явно не будет задан тип, на который он указывет!

Выражения с указателями

Можно присваивать один указатель другому, но эта операция имеет смысл только в том случае, если оба указателя адресуют один и тот же тип, например

Код C++
1
2
3
4
5
6
7
8
9
{ int i=123 *pi1=&i, *pi2;

// присваиваем указателю pi2 значение указателя pi1
pi2=pi1;

//выведем значения указателей:
printf(“ %p %p”, pi1, pi2);

}

В результате мы получим одно и то же значение адреса.

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

Код C++
1
2
3
int x=5, y, *px=&x;

y = *px + 5; // y получит значение 10

Приоритет у унарной операции разадресации * выше, чем у бинарных арифметических операций, поэтому при вычислении выражения *px + 5 вначале будет извлечено содержимое по адресу, хранящемуся в р ( то есть получено значение 5), а затем будет выполнена бинарная операция сложения.

Операции с указателями

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

++ инкремента
- - декремента
+, - сложения и вычитания
Если к указателю применяются операции ++ или --, то указатель увеличивается или уменьшается на размер объекта, который он адресует:

тип *ptr;

ptr ++ = значение ptr + sizeof (тип)

ptr -- = значение ptr - sizeof (тип)

Например:

Код C++
1
2
int i, *pi = &i;
float a, *pa =&a;

pi++; //значение указателя pi увеличивается на 2 байта, так как он адресует объект
//типа int, указатель сдвигается вправо на 2 байта

pa++; // значение указателя pa увеличивается на 4 байта, так как он адресует объект
//типа float, указатель сдвигается вправо на 4 байта

Одним из операндов операции сложения может быть указатель, другим должно быть целое число. Целое число складывается с указателем следующим образом:

тип *ptr;

int n;

ptr + n = значение ptr + n*размер типа

Например,

Код C++
1
2
float a, *pa = &a;
pa = pa+3; // значение указателя pa будет увеличено на 12 байт (сдвиг указателя вправо)

Левым операндом операции вычитания может быть указатель, а правым операндом должно быть целое число:

тип *ptr;

int n;

ptr - n = значение ptr - n*размер типа

Например:

Код C++
1
2
int i, *pi = &i;
pi=pi-5; // уменьшение значения указателя на 10 байт (сдвиг указателя влево)


Пример 3.Использование указателей в выражениях

Код C++
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
void main (void)
{
int x=5,y,*px=&x; //указатель px инициализирован адресом переменной x

y=*px+5; printf("y=%d значение указателя=%p\n",y,px);
y=*px++; //изменение значения указателя после его использования printf("y=%d значение указателя=%p\n",y,px);
px=&x; y=(*px)++; //изменение содержимого по адресу, хранящемуся в px
printf("y=%d значение указателя=%p значение, адресуемое указателем *px= %d\n",y,px,*px);
y=++*px; //изменение содержимого по адресу px на единицу printf("y=%d значение указателя=%p\n",y,px); }

Результаты работы этой программы имеют вид:
y=10 значение указателя=1561:1000
y=5 значение указателя=1561:1002
y=5 значение указателя=1561:1000 значение, адресуемое указателем*px= 6
y=7 значение указателя=1561:1000
1
Кудаив
329 / 406 / 24
Регистрация: 27.05.2012
Сообщений: 1,168
Завершенные тесты: 2
29.03.2013, 18:52 #3
Friday, пиши красивее, с отступами
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
 
int main()
{
    int х, *р;
    х = 10; 
    p = &x;
   *р = х;
}
0
Friday
ну и долго меня небыло...
61 / 57 / 8
Регистрация: 24.03.2013
Сообщений: 173
29.03.2013, 18:56 #4
Цитата Сообщение от Кудаив Посмотреть сообщение
Friday, пиши красивее, с отступами
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
 
int main()
{
    int х, *р;
    х = 10; 
    p = &x;
   *р = х;
}
ты о чем?)

З.Ы. времени не было)
1
29.03.2013, 18:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.03.2013, 18:56
Привет! Вот еще темы с ответами:

Подскажите пожалуйста что тут происходит - C++
Объясните как формируются числа a,b,c,d, пожалуйста. char buf; gets(buf); unsigned int a = buf | (buf &lt;&lt; 8) | (buf &lt;&lt; 16);...

Где тут ошибка, подскажите плз! - C++
#include &quot;stdafx.h&quot; #include &lt;windows.h&gt; #include &lt;iostream&gt; using namespace std; void main() { SetConsoleOutputCP(1251); ...

Выскакивает ошибка Stack around the voriable 'text' was corrupted. Подскажите пожалуйста в чём ошибка - C++
Выскакивает ошибка Stack around the voriable 'text' was corrupted. Подскажите пожалуйста в чём ошибка. #include &lt;iostream&gt; #include...

Подскажите пожалуйста в чем может быть трабл при компиляции класса выдает ошибку - C++
Подскажите пожалуйста в чем может быть проблема: при компиляции класса выдает ошибку: (Ошибка LNK2001 неразрешенный внешний символ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.