1

Тема: Що таке * & і як правильно його застосовувати

Не можу зрозуміти ніяк, де правильно писати перед змінною знак * чи &
Я довго читав мануали, але чомусь досі не зрозумів.
Роблю методом перебору (поки програма не перестане вилітати, а компілятор лаятися)

2 Востаннє редагувалося koala (21.01.2021 22:14:30)

Re: Що таке * & і як правильно його застосовувати

покажчики
посилання
Ніколи не програмуйте методом перебору. Це те саме, що писати текст методом перебору - поки перевірка орфографії не припинить лаятися.

Подякували: Betterthanyou, Chemist-i, petromrov6093

3

Re: Що таке * & і як правильно його застосовувати

Дякую за допомогу посиланнями на більш зрозуміліші українські статті.
Я прочитав, але тільки частину (поверхнево) і потрібні уточнення.
Після уточнень, прочитаю ще раз.
1. Чи правильно я зрозумів, що

char *mas=new char[100];

*mas - це не змінна, як я думав раніше, а ім'я покажчика.
2. Не можна записувати так:

char* mas1, mas2, mas3;

Правильно записувати так:

char* mas1, *mas2, *mas3;

Тобто, щоб показати компілятору що це не змінна, а ім'я покажчика, перед символьної комбінацією записується знак зірочки.
3. А чи діють ті самі правила в символьній комбінації для імен покажчиків, що і для змінних (не можуть починатися з цифри, мають містити тільки

qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890_

) ?
4. Ім'я покажчика якимось дивним чином вказує на адресу в пам'яті.
При порівнянні 2-х імен покажчиків, порівнюються номера адрес в пам'яті.
Якщо один покажчик був створений раніше другого, то його адреса є меншою:

int *p, *p1;
if(p<p1) printf("p firstly\n");
else printf("p secondly\n");

5. Будь-яке ім'я покажчика можна порівняти з нулем (хоча 0-ва адреса стається резервована під біос, не бачу в цьому сенсу).
6. Сенс є, якщо покажчики визначають не адресу пам'яті фізичної, а адресу віртуальної - тої, що виділена даній програмі. Чи це так?
7. Як правильно казати - ім'я покажчика (символьна комбінація), чи покажчик (якийсь невідомий клас)?
8. Синонімами є запис:

char* mas="hello world!";
//mas[11]='.';//крапка замість знаку оклику
*(mas+11)='.';

*mas вказує на початок адреси пам'яті, де міститься його дані, а (*mas+11) - на той елемент пам'яті, де міститься 12-й елемент.
Питання:
1) чи це правильно? Чому мій компілятор на таке сильно лається?
2) А чи можна поміняти значення сусіднього масиву ось таким чином:

*(mas-1000)='.';

9. А чи можна якимось чином надрукувати саме адресу пам'яті, а не значення, що знаходяться в ній?
10. Де можна знайти нормальний асемблерний код цього покажчика, щоб не морочити собі голову?

візьми із компілятора
#include <stdio.h>
int main() {
    float *p1[10]={0,};
    *p1[2]=1.2f;
    printf("p[2]=%.1f\n", &p1[2]);
    return 0;
}
    .file    "main.cpp"
 # GNU C++ (tdm64-1) version 4.9.2 (x86_64-w64-mingw32)
 #    compiled by GNU C version 4.9.2, GMP version 4.3.2, MPFR version 2.4.2, MPC version 0.8.2
 # GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
 # options passed:  -I C:/Program Files/Dev-Cpp/MinGW64/include
 # -I C:/Program Files/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include
 # -I C:/Program Files/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include
 # -I C:/Program Files/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include/c++
 # -imultilib 32
 # -iprefix C:/Program Files/Dev-Cpp/MinGW64/bin/../lib/gcc/x86_64-w64-mingw32/4.9.2/
 # -D_REENTRANT main.cpp -m32 -mtune=generic -march=x86-64
 # -auxbase-strip main.o -fverbose-asm
 # options enabled:  -faggressive-loop-optimizations
 # -fasynchronous-unwind-tables -fauto-inc-dec -fcommon
 # -fdelete-null-pointer-checks -fdwarf2-cfi-asm -fearly-inlining
 # -feliminate-unused-debug-types -fexceptions -ffunction-cse -fgcse-lm
 # -fgnu-runtime -fgnu-unique -fident -finline-atomics -fira-hoist-pressure
 # -fira-share-save-slots -fira-share-spill-slots -fivopts
 # -fkeep-inline-dllexport -fkeep-static-consts -fleading-underscore
 # -fmath-errno -fmerge-debug-strings -fpeephole -fprefetch-loop-arrays
 # -freg-struct-return -fsched-critical-path-heuristic
 # -fsched-dep-count-heuristic -fsched-group-heuristic -fsched-interblock
 # -fsched-last-insn-heuristic -fsched-rank-heuristic -fsched-spec
 # -fsched-spec-insn-heuristic -fsched-stalled-insns-dep
 # -fset-stack-executable -fshow-column -fsigned-zeros
 # -fsplit-ivs-in-unroller -fstrict-volatile-bitfields -fsync-libcalls
 # -ftrapping-math -ftree-coalesce-vars -ftree-cselim -ftree-forwprop
 # -ftree-loop-if-convert -ftree-loop-im -ftree-loop-ivcanon
 # -ftree-loop-optimize -ftree-parallelize-loops= -ftree-phiprop
 # -ftree-reassoc -ftree-scev-cprop -funit-at-a-time -funwind-tables
 # -fverbose-asm -fzero-initialized-in-bss -m32 -m80387 -m96bit-long-double
 # -maccumulate-outgoing-args -malign-double -malign-stringops
 # -mavx256-split-unaligned-load -mavx256-split-unaligned-store
 # -mfancy-math-387 -mfp-ret-in-387 -mfxsr -mieee-fp -mlong-double-80 -mmmx
 # -mms-bitfields -mno-red-zone -mno-sse4 -mpush-args -msahf -msse -msse2
 # -mstack-arg-probe

    .def    ___main;    .scl    2;    .type    32;    .endef
    .section .rdata,"dr"
LC1:
    .ascii "p[2]=%.1f\12\0"
    .text
    .globl    _main
    .def    _main;    .scl    2;    .type    32;    .endef
_main:
    pushl    %ebp     #
    movl    %esp, %ebp     #,
    pushl    %edi     #
    andl    $-16, %esp     #,
    subl    $64, %esp     #,
    call    ___main     #
    leal    24(%esp), %edx     #, tmp86
    movl    $0, %eax     #, tmp87
    movl    $10, %ecx     #, tmp88
    movl    %edx, %edi     # tmp86, tmp86
    rep stosl
    movl    32(%esp), %edx     # p1, D.2907
    movl    LC0, %eax     #, tmp89
    movl    %eax, (%edx)     # tmp89, *_1
    leal    24(%esp), %eax     #, tmp90
    addl    $8, %eax     #, tmp91
    movl    %eax, 4(%esp)     # tmp91,
    movl    $LC1, (%esp)     #,
    call    _printf     #
    movl    $0, %eax     #, D.2908
    movl    -4(%ebp), %edi     #,
    leave
    ret
    .section .rdata,"dr"
    .align 4
LC0:
    .long    1067030938
    .ident    "GCC: (tdm64-1) 4.9.2"
    .def    _printf;    .scl    2;    .type    32;    .endef

Потрібен "людський" код з коментарями.

4

Re: Що таке * & і як правильно його застосовувати

яка мова?