Very short answer :
Change this:
char **str;
For this:
char (*str)[10];
. str . int main() (void C). , undefined :
#include <stdio.h>
int main()
{
char a[5][10]={"one","two","three","four","five"};
char (*str)[10] = a;
printf("%p ", &a[0]);
printf("\n%p ", &str[0]);
printf("\n%p ", &str[3]);
printf("\n%p ", &str[1][56]);
printf("\n%p ", &(*(*(str+4)+1)));
return 0;
}
, printf() &(*(...)), . , :
printf("\n%p ", *(str+4)+1);
( )
0x7fff5fbff900
0x7fff5fbff900
0x7fff5fbff91e
0x7fff5fbff942
0x7fff5fbff929
(, )
, . . a
char a[5][10]
0 1 2 3 4 5 6 7 8 9
-----------------------------------------
0 | o | n | e | 0 | | | | | | |
-----------------------------------------
1 | t | w | o | 0 | | | | | | |
-----------------------------------------
2 | t | h | r | e | e | 0 | | | | |
-----------------------------------------
3 | f | o | u | r | 0 | | | | | |
-----------------------------------------
4 | f | i | v | e | 0 | | | | | |
-----------------------------------------
, , &a[1], , &a[0] ( ). :
int main()
{
char a[5][10] = { "one", "two", "three", "four", "five" };
printf("&a = %p\n", &a);
printf("&a[0] = %p\n", &a[0]);
printf("a[0] = %p\n", a[0]);
printf("&a[1] = %p\n", &a[1]);
printf("a[1] = %p\n", a[1]);
return 0;
}
&a = 0x7fff5fbff8e0
&a[0] = 0x7fff5fbff8e0
a[0] = 0x7fff5fbff8e0
&a[1] = 0x7fff5fbff8ea
a[1] = 0x7fff5fbff8ea
, a[1] 10 (0x0a hex) . ? , .
?
C ++ , void, . , . .
int *iptr = malloc(5*sizeof(int));
iptr , 5 . , , :
iptr[1] = 1;
:
*(iptr+1) = 1;
; 1 ( 0-). , * (, ). (iptr+1) ( int - 32 , , 64 ), ?
: - . , , , ( - int). / , " ". . :
#include <stdio.h>
typedef struct Data
{
int ival;
float fval;
char buffer[100];
} Data;
int main()
{
int ivals[10];
int *iptr = ivals;
char str[] = "Message";
char *pchr = str;
Data data[2];
Data *dptr = data;
printf("iptr = %p\n", iptr);
printf("iptr+1 = %p\n", iptr+1);
printf("pchr = %p\n", pchr);
printf("pchr+1 = %p\n", pchr+1);
printf("dptr = %p\n", dptr);
printf("dptr+1 = %p\n", dptr+1);
return 0;
}
iptr = 0x7fff5fbff900
iptr+1 = 0x7fff5fbff904
pchr = 0x7fff5fbff8f0
pchr+1 = 0x7fff5fbff8f1
dptr = 0x7fff5fbff810
dptr+1 = 0x7fff5fbff87c
, iptr iptr+1 ; ( int ). char pchr pchr+1 . , Data dptr dptr+1 , 0x6C 108 . ( - , , ). , 4- (int float) char 100 .
, , C/++. . :
int ar[10];
int *iptr1 = ar+1;
int *iptr5 = ar+5;
, :
printf("%lu", iptr5 - iptr1);
: 4. , . ? . .
, , :
int ar[5];
int *iptr = ar;
iptr[1] = 1;
, :
*(iptr+1) = 1;
"" " , iptr, 1 * ( int ), 1 ."
: . , ,
1[iptr] = 1;
() . , , a, ( , ):
char **str = a; // Error: Incompatible pointer types: char ** and char[5][10]
, . . char ** - char. , , . .. , , a str.
char **str = (char **)(a); // Should NEVER do this, here for demonstration only.
char *s0 = str[0]; // what do you suppose this is?
:
int main()
{
char a[5][10] = { "one", "two", "three", "four", "five" };
char **str = (char **)a;
char *s0 = str[0];
char *s1 = str[1];
printf("&a = %p\n", &a);
printf("&a[0] = %p\n", &a[0]);
printf("a[0] = %p\n", a[0]);
printf("&a[1] = %p\n", &a[1]);
printf("a[1] = %p\n", a[1]);
printf("str = %p\n", str);
printf("s0 = %p\n", s0);
printf("s1 = %p\n", s1);
return 0;
}
:
&a = 0x7fff5fbff900
&a[0] = 0x7fff5fbff900
a[0] = 0x7fff5fbff900
&a[1] = 0x7fff5fbff90a
a[1] = 0x7fff5fbff90a
str = 0x7fff5fbff900
s0 = 0x656e6f
s1 = 0x6f77740000
, str , , s0? , ASCII . ? ASCII :
0x65 : e
0x6e : n
0x6f : o
"" ( , , . :
0x6f : o
0x77 : w
0x74 : t
, "". , ?
.. , . , , . . :
str[1]
:
*(str+1)
. . str? , , char. :
str + 0
str + 1
a char*. 4 ( 32- ). , str[1] - .
, (, , , ).
str[3] 0xbf7f6292
: :
&str[3]
:
(str + 3)
, (str + 3) - , str, 3x, str , char *, . . printf, :
0xbf7f6286
, 4 (32- ). ...
0xbf7f6286 + (3 * 4)
....
0xbf7f6286 + 0x0C = 0xbf7f6292