Portál AbcLinuxu, 10. května 2025 22:51
Řešení dotazu:
#include <stdio.h> #define PRE "v" #define N "1" #define N2 "2" #define S PRE N"."N2 #define SS(a,b) PRE a"."b int main(int argc, char **argv, char **env) { const char *word = S; const char *word2 = SS(N, N2); puts(word); puts(word2); return 0; }
#define BASESTRING "CISLO: " #define CISLO1 1 #define CISLO2 2 #include <stdio.h> #define xstr(s) str(s) #define str(s) #s #define CISLO1 1 #define CISLO2 2 ... const char vystup[]=BASESTRING xstr(CISLO1) "." xstr(CISLO2);Lebo Stringification a String-Constants
char data[]="meno"; char *data="meno"; const char *data="meno";
riadok 1. - nemôžeš urobiť data=data2. Teda nemôžeš priradiť do premennej typu pole.
riadok 2. - môžeš urobiť data=data2 ak data2 je pointer. Ale napr. sizeof
vracia inú hodnotu ako pri riadku 1, v jednom prípade je to veľkosť pointra (na 32 bitovom systéme typicky sizeof povie 4), v druhom prípade sa vráti veľkosť pamäti zabratej poľom - čo je v tomto prípade 5 (4 písmená a '\0')
riadok 3. - nemôžeš urobiť data[i]='x'. Teda: data[i] je "const char" a priradenie je v rozpore s tým "const".
Tipujem, že toto už je iný level debaty než Jirka potrebuje.
Tá otázka nedáva zmysel.
char *je iný dátový typ ako
char []tak sa proste chová inak.
Podobne kľúčové slovo const
dáve kompilátoru pokyn, aby niečo robil/nerobil. Nie je to vynútené architektúrou procesora ani božím prikázaním ani ničím podobným. Skrátka jazyk C definuje, že nejaký zápis spôsobuje nejaké chovanie.
char *
em jsou ve výsledné binárce uložené v segmentu .rodata a tudíž se nedají modifikovat?
Mezi
char *s = "Peppa"; const char *t = "Pig";v principu není rozdíl, akorát v tom druhém případě kompilátor zabrání tomu, aby se někdo pokusil udělat
t[0] = 'B'
.
#include <stdio.h> #define PREFIX "v" #define MAJOR 1 #define MINOR 2 #define STR(a) #a #define VERSION(a,b) PREFIX STR(a) "." STR(b) int main(int argc, char **argv, char **env) { const char *version = VERSION(MAJOR, MINOR); puts(version); return 0; }
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.