0 / 0 / 0
Регистрация: 23.02.2014
Сообщений: 13
1

Нюансы синтаксиса и тонкости использования указателей и массивов

11.01.2016, 21:43. Показов 353. Ответов 6
Метки нет (Все метки)

Доброго времени суток!
Никак не могу понять, почему один вариант кода работает:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream> 
#include <stdlib.h>
 
#include <cstring>
using namespace std;
 
char *strc(char *str1,char *str2)
{   char *d=str1;
    while(*str2)
    {
        *str1=*str2;
        str1++;
        str2++;
    }
    return str1;
}
 
int main ()
{
    char inp[]="1";
    char test[]="testtest";
    
    strc(inp,test);
    
    cout<<inp;
}
А второй не компилируется:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream> 
#include <stdlib.h>
 
#include <cstring>
using namespace std;
 
int main ()
{
    char inp[]="1";
    char test[]="testtest";
    
    while(*test)
    {
        *inp=*test;
        test++;
        inp++;
    }
    
    cout<<inp;
}
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.01.2016, 21:43
Ответы с готовыми решениями:

Объяснить нюансы использования указателей, массивов и ссылок в функциях
Здравствуйте. Скажите, а что выводит arry значения элемента массива или его адрес? А как понимать...

Нюансы использования динамических массивов в качестве данных-членов в классах
Здравствуйте! Не могу создать массив объектов. Помогите ... class hashTable { private:...

Тонкости синтаксиса C#. Приведение типов
Привет всем. Ну никак я не могу привыкнуть к этому C#. Постоянно какие-то ошибки там, где они не...

Нюансы синтаксиса
Откуда взялась функция nextOdd()? package main import &quot;fmt&quot; func makeOddGenerator() func()...

6
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
11.01.2016, 21:53 2
потому что test и inp - это не указатели а массивы. в первом варианте вызвается функция, которая указатели принимает и это работает из-за того, что в массивы неявно преобразуются в указатель на первый элемент. далее в функции инкрементируются указатели. а вот инкрементить массив уже нельзя. может там и есть попытка его кастануть в указатель, но дальше идет инкремент этого временного объекта-указателя, что лишено смысла в силу ряда причин.
0
Хитрая блондиночка $)
1464 / 979 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
11.01.2016, 21:59 3
Цитата Сообщение от Terawatt93 Посмотреть сообщение
test++; inp++;
Это же не указатели.
Если бы ты написал
C++
1
2
    char *inp="1";
    char *test="testtest";
Тогда, думаю прокатило бы, а так это обычный массив символов.
0
Don't worry, be happy
17165 / 10049 / 1934
Регистрация: 27.09.2012
Сообщений: 25,035
Записей в блоге: 1
12.01.2016, 09:36 4
Цитата Сообщение от Hikari Посмотреть сообщение
Тогда, думаю прокатило бы
тогда это
Цитата Сообщение от Terawatt93 Посмотреть сообщение
C++
1
*inp=*test;
не прокатит
Но даже если бы в обоих случаях прокатило, то оно бы очень быстро вылезло за границы.
0
Хитрая блондиночка $)
1464 / 979 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
12.01.2016, 09:43 5
Цитата Сообщение от Croessmah Посмотреть сообщение
не прокатит
Почему? Из-за константного вида строки?
0
Don't worry, be happy
17165 / 10049 / 1934
Регистрация: 27.09.2012
Сообщений: 25,035
Записей в блоге: 1
12.01.2016, 09:48 6
Цитата Сообщение от Hikari Посмотреть сообщение
Почему? Из-за константного вида строки?
угу. Будем же писать черть знает куда
0
Хитрая блондиночка $)
1464 / 979 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
12.01.2016, 11:27 7
Цитата Сообщение от Croessmah Посмотреть сообщение
Будем же писать черть знает куда
Да. Есть и такая опасность.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.01.2016, 11:27

Объясните некоторые тонкости указателей
Всем добрый вечер. Вот так выглядит сам код: //Программа объявляет указатель на массив типа...

Регулярные выражения в Delphi — тонкости синтаксиса (модуль RegularExpressions)
Здравствуйте, уважаемые коллеги! Обстоятельства: Win7, Delphi XE5 + стандартный (&quot;родной&quot;)...

Нюансы синтаксиса: использование using
Всем доброе утро, вообщем хотел спросить давно уже, а что делает using, помимо вот такого его...

Нюансы синтаксиса: использование typedef
typedef int(*compare_func)(void* left, void* right); В первых круглых скобках - &quot;*compare_func&quot;...


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

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

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