Olej писал(а):
Но примеры получаются временами ... смешные.
Следующая группа операций: агрегирование данных из простых скалярных (файл 2.c):
Код: Выделить всё
bash-4.2$ cat 2.c
#include <stdio.h>
#include <string.h>
#include <wchar.h>
// агрегаты данных:
int main () {
int ai[] = { 1, 2, 3, 4, 5 }, ni, j;
printf( "%d => ", ni = sizeof( ai ) / sizeof( ai[ 0 ] ) );
for( j = 0; j < ni; j++ ) printf( "%d, ", ai[ j ] );
printf( "\n" );
// разница в представлении
char ac[] = { '1', '2', '3', '4', '5', 0, '6', '\0' };
printf( "%d (строка %d) => ", ni = sizeof( ac ) / sizeof( ac[ 0 ] ), strlen( ac ) );
for( j = 0; j < ni; j++ ) printf( "%d, ", ac[ j ] );
printf( "\n" );
// присвоение структурных данных
struct ss {
int a1, a2, a3;
} vss1 = { 1, 2, 3 }, vss2 = { 3, 2, 1 };
vss1 = vss2;
printf( " %d %d %d \n", vss1.a1, vss1.a2, vss1.a3 );
// наложение разнородныз данных
struct su {
union {
char c[ 12 ];
short s[ 6 ];
float f[ 3 ];
};
} su1 = {{{ '1', '2', '3', '4', '5', '6', 0, 0, 0, 0, 0, 0 }}};
printf( "размер структуры %d байт\n", sizeof( su1 ) );
for( j = 0; j < sizeof( su1.c ) / sizeof( su1.c[ 0 ] ); j++ )
printf( "%d, ", su1.c[ j ] );
printf( "\n" );
for( j = 0; j < sizeof( su1.s ) / sizeof( su1.s[ 0 ] ); j++ )
printf( "%d, ", su1.s[ j ] );
printf( "\n" );
for( j = 0; j < sizeof( su1.f ) / sizeof( su1.f[ 0 ] ); j++ )
printf( "%f, ", su1.f[ j ] );
printf( "\n" );
char *p = (char*)&su1;
printf( "адрес=%p : %s, длина %d символов\n", p, p, strlen( p ) );
// разница длины UTF-8 строки (русскоязычной) в байтах и символах
const char buf[] = "русскоязычная строка";
printf( "строка: '%s', длина %d ,байт\n", buf, strlen( buf ) );
return 0;
}
Результатом это имеет:
Код: Выделить всё
bash-4.2$ ./exe2
5 => 1, 2, 3, 4, 5,
8 (строка 5) => 49, 50, 51, 52, 53, 0, 54, 0,
3 2 1
размер структуры 12 байт
49, 50, 51, 52, 53, 54, 0, 0, 0, 0, 0, 0,
12849, 13363, 13877, 0, 0, 0,
0.000000, 0.000000, 0.000000,
адрес=0xbf8c7e34 : 123456, длина 6 символов
строка: 'русскоязычная строка', длина 39 ,байт
Любопытный последний результат: глаза явно видят 20 букв, а программа говорит 39 байт
![Подмигивает ;-)](./images/smilies/icon_e_wink.gif)