LINUX.ORG.RU

История изменений

Исправление praseodim, (текущая версия) :

Значит плохо читал, ибо там всё аргументированно расписано.

Мне показалось, что основной посыл - это несовременность и отсутствие правильного подхода к проектированию, а также преувеличение значимости указателей и побочных эффектов. И вообще отрицание большого количества современных технологий.

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

Для новичка очень многое в Паскале сразу правильно мозги ставит, в отличие от Си, где легко в осадок выпасть даже казалось бы умея программировать.

Там выше для anc я уже приводил пример с указателями. Объяснить, что с ними и массивами творится в Си не так и просто. Вроде кажется все понятно и вдруг, например, такой код:

int a[3]; a[0] = 0; *(a+1)=1000; 2[a]=2000; 
for( int i=0;i<3;i++) printf("a[%d]=%d\n",i,a[i]);

Кажется и его объяснить можно, но допустим после объяснения студент захочет написать:

int a[3]; a[0] = 0; *(a+1)=1000; 2[a]=2000; 
int b[3];
b = a;
for( int i=0;i<3;i++) printf("b[%d]=%d\n",i,b[i]);

И нарывается на ошибки компиляции в строке b = a. WTF? И никакие ухищрения с взятием адреса почему-то не помогают.

Что такое? В чем дело? А тут нюанс, как говорится.

Многим может показаться, что a и b - указатели на массивы. На это прямо все намекает, в том числе эквивалентность *(a+index) и a[index], и то, что *a эквивалентно a[0].

А не тут-то было. Если хорошо подумать, то даже как бы и очевидно, но вряд ли для новичка только изучающего программирование.

На самом деле a и b - вовсе не указатели, а таки array type, который ведет себя как указатель и обозначает сам массив. То есть, внутри a и b не хранится указатель на массив, они синтаксически и есть массив, но для доступа к элементам массива могут выглядеть как указатель.

Казалось бы ну теперь все поняли. Ан нет, не совсем =)

Можно написать

int a[3]; *a = 0; *(a+1)=1000; 2[a]=2000; 
int *b;
b = &a[0];
for( int i=0;i<3;i++) printf("b[%d]=%d\n",i,b[i]);

И все будет, так сказать, работать. Ну и как оно теперь с понятностью что такое массивы и указатели?

В Паскале же подобного хакерства нет. Там массив - это массив, указатель - указатель. При большом желании причем можно взять адрес первого элемента массива и начать к нему прибавлять какие-то значения.

Исходная версия praseodim, :

Значит плохо читал, ибо там всё аргументированно расписано.

Мне показалось, что основной посыл - это несовременность и отсутствие правильного подхода к проектированию, а также преувеличение значимости указателей и побочных эффектов. И вообще отрицание большого количества современных технологий.

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

Для новичка очень многое в Паскале сразу правильно мозги ставит, в отличие от Си, где легко в осадок выпасть даже казалось бы умея программировать.

Там выше для anc я уже приводил пример с указателями. Объяснить, что с ними и массивами творится в Си не так и просто. Вроде кажется все понятно и вдруг, например, такой код:

int a[3]; a[0] = 0; *(a+1)=1000; 2[a]=2000; 
for( int i=0;i<3;i++) printf("a[%d]=%d\n",i,a[i]);

Кажется и его объяснить можно, но допустим после объяснения студент захочет написать:

int a[3]; a[0] = 0; *(a+1)=1000; 2[a]=2000; 
int b[3];
b = a;
for( int i=0;i<3;i++) printf("b[%d]=%d\n",i,b[i]);

И нарывается на ошибки компиляции в строке b = a. WTF? И никакие ухищрения с взятием адреса почему-то не помогают.

Что такое? В чем дело? А тут нюанс, как говорится.

Многим может показаться, что a и b - указатели на массивы. На это прямо все намекает, в том числе эквивалентность *(a+index) и a[index], и то, что *a эквивалентно a[0].

А не тут-то было. Если хорошо подумать, то даже как бы и очевидно, но вряд ли для новичка только изучающего программирование.

На самом деле a и b - вовсе не указатели, а таки array type, который ведет себя как указатель и обозначает сам массив. То есть, внутри a и b не хранится указатель на массив, они синтаксически и есть массив, но для доступа к элементам массива могут выглядеть как указатель.

В Паскале же подобного хакерства нет. Там массив - это массив, указатель - указатель. При большом желании причем можно взять адрес первого элемента массива и начать к нему прибавлять какие-то значения.