Определите переменную-указатель на целое. Убедитесь, что разыменование неинициализированного указателя скорее всего ведет к ошибке времени выполнения.
Убедитесь, что разыменование нулевого указателя и запись по нулевому адресу ведут к ошибке времени выполнения:
int * p = 0;
printf("%d", *p); // error!
*p = 1; // error!
Проинициализируйте указатель адресом переменной. Убедитесь, что при распечатке содержимого указателя как целого числа печатается некий адрес. Выведите адрес на экран в шестнадцатеричном виде (%X
в printf
).
Убедитесь, что содержимое переменной изменяется при записи через разыменованный указатель.
int * f() {int i = 0; return &i;}
.
Убедитесь, что разыменование указателя на исчезнувшую переменную приводит (или не приводит) к ошибке времени выполнения. Объясните, почему.
int a[] = {6, 0, 3, 1, 7, 6, 9}; int *p = a;
Убедитесь, что указателем p можно пользоваться для перебора элементов массива. Выведите массив на экран, используя синтаксис: p[i]
, более длинный: *(p+i)
.
Убедитесь, что выход за край массива может привести к ошибке времени выполнения (а может и не привести). p[-1] = 100500;
(выход за левый край) p[7] = 100500;
(выход за правый край).
Выведите элементы массива на экран не используя индекс. Для этого на каждом шаге цикла увеличивайте указатель на единицу, а для печати разыменовывайте. Придумайте условие цикла без счетчика. Добавьте к распечатке элементов массива распечатку самого указателя. Убедитесь, что значение (адрес) в указателе увеличивается.
Напишите функцию inc
, принимающую указатель на целое и увеличивающую это целое по указателю. Убедитесь в том, что функция действительно меняет значение по принятому указателю.
int a[] = {6, 0, 3, 1, 7, 6, 9}; int *p = a;
Убедитесь, что размер массива a составляет 28 байт, указателя p – 4 или 8 байт (используйте операцию sizeof
).
void f(int arr[]) {printf(“arg size: %d\n”, sizeof(arr);}
Убедитесь, что при «передаче» любого массива в функцию, в реальности передается только указатель. Размер аргумента arr
будет либо 4, либо 8 байт.