LINUX.ORG.RU

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

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

вместо T* ptr, пишешь T& ref. это в с++. в си ссылок нет вроде, но могли бы ввести.

Ссылки в C++ возможно использовать далеко не во всех вариантах. Для выделения памяти, например, нельзя.

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

Ты, похоже, сам не понимаешь, зачем он. Вычисление адресов на асме и указатели в Си – разные вещи. Например, в Си ты не можешь просто взять и вычесть два указателя друг из друга, потому что это может быть UB. Хуже того, у тебя по адресу (void*)0 может быть замаплена страница, никто этому не мешает в принципе, но из-за сишной шизофрении ты не можешь туда обратиться. То есть, можешь, конечно, но компилятор стопудов напихает тебе говна в код. Но вот такое будет работать:

$ sysctl vm.mmap_min_addr=0
#include <sys/mman.h>
#include <stdio.h>
#include <string.h>

int main(void) {
    char *addr = mmap(NULL, 6, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_FIXED|MAP_ANONYMOUS, -1, 0);
    if (addr == MAP_FAILED) {
        perror("mmap");
        return 1;
    }
    strcpy(addr, "abcxyz");
    printf("Mapped into addr=0x%X\n", addr);
    printf("%s\n", addr);
    printf("%s\n", NULL);
}

Исправление hateyoufeel, :

вместо T* ptr, пишешь T& ref. это в с++. в си ссылок нет вроде, но могли бы ввести.

Ссылки в C++ возможно использовать далеко не во всех вариантах. Для выделения памяти, например, нельзя.

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

Ты, похоже, сам не понимаешь, зачем он. Вычисление адресов на асме и указатели в Си – разные вещи. Например, в Си ты не можешь просто взять и вычесть два указателя друг из друга, потому что это может быть UB. Хуже того, у тебя по адресу (void*)0 может быть замаплена страница, никто этому не мешает в принципе, но из-за сишной шизофрении ты не можешь туда обратиться. То есть, можешь, конечно, но компилятор стопудов напихает тебе говна в код. Но вот такое будет работать:

sysctl vm.mmap_min_addr=0

#include <sys/mman.h>
#include <stdio.h>
#include <string.h>

int main(void) {
    char *addr = mmap(NULL, 6, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_FIXED|MAP_ANONYMOUS, -1, 0);
    if (addr == MAP_FAILED) {
        perror("mmap");
        return 1;
    }
    strcpy(addr, "abcxyz");
    printf("Mapped into addr=0x%X\n", addr);
    printf("%s\n", addr);
    printf("%s\n", NULL);
}

Исправление hateyoufeel, :

вместо T* ptr, пишешь T& ref. это в с++. в си ссылок нет вроде, но могли бы ввести.

Ссылки в C++ возможно использовать далеко не во всех вариантах. Для выделения памяти, например, нельзя.

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

Ты, похоже, сам не понимаешь, зачем он. Вычисление адресов на асме и указатели в Си – разные вещи. Например, в Си ты не можешь просто взять и вычесть два указателя друг из друга, потому что это может быть UB. Хуже того, у тебя по адресу (void*)0 может быть замаплена страница, никто этому не мешает в принципе, но из-за сишной шизофрении ты не можешь туда обратиться.

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

вместо T* ptr, пишешь T& ref. это в с++. в си ссылок нет вроде, но могли бы ввести.

Ссылки в C++ возможно использовать далеко не во всех вариантах. Для выделения памяти, например, нельзя.

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

Ты, похоже, не понимаешь, зачем он. Вычисление адресов на асме и указатели в Си – разные вещи. Например, в Си ты не можешь просто взять и вычесть два указателя друг из друга, потому что это может быть UB. Хуже того, у тебя по адресу (void*)0 может быть замаплена страница, никто этому не мешает в принципе, но из-за сишной шизофрении ты не можешь туда обратиться.