Type-casting with Character Pointer ==================================== * In this section, you are going to learn .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow How to manipulate integer using character pointer ? .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow How to manipulate short integer using character pointer ? .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow How to manipulate structure using character pointer ? .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow How to swap bytes using character pointer ? .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow How to manipulate heap using character pointer ? .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Topics in this section, * :ref:`Example 1 : Manipulate Integer : Using character pointer pointing to an integer ` * :ref:`Example 2 : Manipulate Short Integer : Using character pointer pointing to a short integer ` * :ref:`Example 3 : Manipulate Structure : Using character pointer pointing to a structure ` * :ref:`Example 4 : Manipulate Integer Array : Using character pointer pointing to an integer array ` * :ref:`Example 5 : Swap two bytes in an Integer using character pointer ` * :ref:`Example 6 : Swap two bytes in an Integer using character pointer : Bitwise logic ` * :ref:`Example 7 : Swap two bytes in an Integer using character pointer : Bitwise logic ` * :ref:`Example 8 : Swap two bytes in a Short Integer using character pointer : Bitwise logic ` * :ref:`Example 9 : Swap two bytes in a Short Integer using character pointer : Bitwise logic ` * :ref:`Example 10 : Integer pointer arithmetic changes after type conversion to Chracter pointer ` * :ref:`Example 11 : Manipulate Heap : Compare heap access with char and int pointer ` * :ref:`Summary ` .. _typecasting_n_ptr_sp_char_ptr_ex_1: .. tab-set:: .. tab-item:: Example 1 : Manipulate Integer : Using character pointer pointing to an integer .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow How to change content of an Integer using character pointer ? .. code-block:: c :linenos: :emphasize-lines: 5, 7, 10 #include int main(void) { unsigned int x = 0x11223344; unsigned char *ptr; // Step 1 : ptr is pointing to a block of 4 bytes ptr = (unsigned char *) &x; // Step 2 : ptr can access all 4 bytes for read printf("\nPrint before change : Using character pointer\n"); for (int i = 0; i < sizeof(int); i++) { printf("ptr[%d] = %x\n", i, ptr[i]); } printf("\nPrint before change : Using integer\n"); printf("x = %x\n", x); // Step 3 : ptr can access all 4 bytes for write ptr[0] = 0xaa; ptr[1] = 0xbb; ptr[2] = 0xcc; ptr[3] = 0xdd; printf("\nPrint after change : Using character pointer\n"); for (int i = 0; i < sizeof(int); i++) { printf("ptr[%d] = %x\n", i, ptr[i]); } printf("\nPrint after change : Using integer\n"); printf("x = %x\n", x); return 0; } .. tab-set:: .. tab-item:: Output .. code-block:: c :linenos: :emphasize-lines: 1, 7, 10, 16 Print before change : Using character pointer ptr[0] = 44 ptr[1] = 33 ptr[2] = 22 ptr[3] = 11 Print before change : Using integer x = 11223344 Print after change : Using character pointer ptr[0] = aa ptr[1] = bb ptr[2] = cc ptr[3] = dd Print after change : Using integer x = ddccbbaa .. _typecasting_n_ptr_sp_char_ptr_ex_2: .. tab-set:: .. tab-item:: Example 2 : Manipulate Short Integer : Using character pointer pointing to a short integer .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow How to change content of a Short Integer using character pointer ? .. code-block:: c :linenos: :emphasize-lines: 5, 7, 10 #include int main(void) { unsigned short int x = 0x1122; unsigned char *ptr; // Step 1 : ptr is pointing to a block of 2 bytes ptr = (unsigned char *) &x; // Step 2 : ptr can access all 2 bytes for read printf("\nPrint before change : Using character pointer\n"); for (int i = 0; i < sizeof(unsigned short int); i++) { printf("ptr[%d] = %x\n", i, ptr[i]); } printf("\nPrint before change : Using integer\n"); printf("x = %x\n", x); // Step 3 : ptr can access all 2 bytes for write ptr[0] = 0xaa; ptr[1] = 0xbb; printf("\nPrint after change : Using character pointer\n"); for (int i = 0; i < sizeof(unsigned short int); i++) { printf("ptr[%d] = %x\n", i, ptr[i]); } printf("\nPrint after change : Using integer\n"); printf("x = %x\n", x); return 0; } .. tab-set:: .. tab-item:: Output .. code-block:: c :linenos: :emphasize-lines: 1, 8, 12 Print before change : Using character pointer ptr[0] = 22 ptr[1] = 11 Print before change : Using integer x = 1122 Print after change : Using character pointer ptr[0] = aa ptr[1] = bb Print after change : Using integer x = bbaa .. _typecasting_n_ptr_sp_char_ptr_ex_3: .. tab-set:: .. tab-item:: Example 3 : Manipulate Structure : Using character pointer pointing to a structure .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow How to change content of a Structure using character pointer ? .. code-block:: c :linenos: :emphasize-lines: 12, 14, 17 #include struct ABC { int a; int b; int c; }; int main(void) { struct ABC x = { .a = 0x11223344, .b = 0x55667788, .c = 0x99aabbcc }; unsigned char *ptr; // Step 1 : ptr is pointing to a block of 12 bytes ptr = (unsigned char *) &x; // Step 2 : ptr can access all 12 bytes for read printf("\nPrint before change : Using character pointer\n"); for (int i = 0; i < sizeof(struct ABC); i++) { printf("ptr[%d] = %x\n", i, ptr[i]); } printf("\nPrint before change : Using Structure\n"); printf("x.a = %x\n", x.a); printf("x.b = %x\n", x.b); printf("x.c = %x\n", x.c); // Step 3 : ptr can access all 12 bytes for write // Step 3.1 : Change x.a using ptr ptr[0] = 0x11; ptr[1] = 0x11; ptr[2] = 0x11; ptr[3] = 0x11; // Step 3.2 : Change x.b using ptr ptr[4] = 0x22; ptr[5] = 0x22; ptr[6] = 0x22; ptr[7] = 0x22; // Step 3.3 : Change x.c using ptr ptr[8] = 0x33; ptr[9] = 0x33; ptr[10] = 0x33; ptr[11] = 0x33; printf("\nPrint after change : Using character pointer\n"); for (int i = 0; i < sizeof(struct ABC); i++) { printf("ptr[%d] = %x\n", i, ptr[i]); } printf("\nPrint after change : Using Structure\n"); printf("x.a = %x\n", x.a); printf("x.b = %x\n", x.b); printf("x.c = %x\n", x.c); return 0; } .. tab-set:: .. tab-item:: Output .. code-block:: c :linenos: :emphasize-lines: 1, 15, 20, 34 Print before change : Using character pointer ptr[0] = 44 ptr[1] = 33 ptr[2] = 22 ptr[3] = 11 ptr[4] = 88 ptr[5] = 77 ptr[6] = 66 ptr[7] = 55 ptr[8] = cc ptr[9] = bb ptr[10] = aa ptr[11] = 99 Print before change : Using Structure x.a = 11223344 x.b = 55667788 x.c = 99aabbcc Print after change : Using character pointer ptr[0] = 11 ptr[1] = 11 ptr[2] = 11 ptr[3] = 11 ptr[4] = 22 ptr[5] = 22 ptr[6] = 22 ptr[7] = 22 ptr[8] = 33 ptr[9] = 33 ptr[10] = 33 ptr[11] = 33 Print after change : Using Structure x.a = 11111111 x.b = 22222222 x.c = 33333333 .. _typecasting_n_ptr_sp_char_ptr_ex_4: .. tab-set:: .. tab-item:: Example 4 : Manipulate Integer Array : Using character pointer pointing to an integer array .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow How to change content of an Integer array using character pointer ? .. code-block:: c :linenos: :emphasize-lines: 5, 7, 10 #include int main(void) { unsigned int x[] = {0x11111111, 0x22222222, 0x33333333, 0x44444444 }; unsigned char *ptr; // Step 1 : ptr is pointing to a block of 16 bytes ptr = (unsigned char *) x; // Step 2 : ptr can access all 16 bytes for read printf("\nBefore Change : Print using character pointer\n"); for (int i = 0; i < sizeof(x); i++) { printf("ptr[%d] = %x\n", i, ptr[i]); } // Step 3 : ptr can access all 16 bytes for write for (int i = 0; i < sizeof(x); i++) { ptr[i] = 0xaa; } printf("\nAfter Change : Print using character pointer\n"); for (int i = 0; i < sizeof(x); i++) { printf("ptr[%d] = %x\n", i, ptr[i]); } printf("\nAfter Change : Print using integer array\n"); printf("x[0] = %x\n", x[0]); printf("x[1] = %x\n", x[1]); printf("x[2] = %x\n", x[2]); printf("x[3] = %x\n", x[3]); return 0; } .. tab-set:: .. tab-item:: Output .. code-block:: c :linenos: :emphasize-lines: 1, 19, 37 Before Change : Print using character pointer ptr[0] = 11 ptr[1] = 11 ptr[2] = 11 ptr[3] = 11 ptr[4] = 22 ptr[5] = 22 ptr[6] = 22 ptr[7] = 22 ptr[8] = 33 ptr[9] = 33 ptr[10] = 33 ptr[11] = 33 ptr[12] = 44 ptr[13] = 44 ptr[14] = 44 ptr[15] = 44 After Change : Print using character pointer ptr[0] = aa ptr[1] = aa ptr[2] = aa ptr[3] = aa ptr[4] = aa ptr[5] = aa ptr[6] = aa ptr[7] = aa ptr[8] = aa ptr[9] = aa ptr[10] = aa ptr[11] = aa ptr[12] = aa ptr[13] = aa ptr[14] = aa ptr[15] = aa After Change : Print using integer array x[0] = aaaaaaaa x[1] = aaaaaaaa x[2] = aaaaaaaa x[3] = aaaaaaaa .. _typecasting_n_ptr_sp_char_ptr_ex_5: .. tab-set:: .. tab-item:: Example 5 : Swap two bytes in an Integer using character pointer .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow How to swap two bytes in an Integer using character pointer ? .. code-block:: c :linenos: :emphasize-lines: 13 /* Program to swap byte 0 and byte 3 of an integer */ #include int main(void) { unsigned int x = 0x11223344; unsigned char *ptr; unsigned char temp; // Step 1 : ptr is pointing to a block of 4 bytes ptr = (unsigned char *) &x; printf("Before swap : x = %x\n", x); temp = ptr[0]; ptr[0] = ptr[3]; ptr[3] = temp; printf("After swap : x = %x\n", x); return 0; } .. tab-set:: .. tab-item:: Output .. code-block:: c :linenos: Before swap : x = 11223344 After swap : x = 44223311 .. _typecasting_n_ptr_sp_char_ptr_ex_6: .. tab-set:: .. tab-item:: Example 6 : Swap two bytes in an Integer using character pointer : Bitwise logic .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow How to swap two bytes in an Integer using character pointer ? .. code-block:: c :linenos: :emphasize-lines: 11 /* Program to swap byte 0 and byte 3 of an integer */ #include int main(void) { unsigned int x = 0x11223344; unsigned char *ptr; // Step 1 : ptr is pointing to a block of 4 bytes ptr = (unsigned char *) &x; printf("Before swap : x = %x\n", x); ptr[0] ^= ptr[3]; ptr[3] ^= ptr[0]; ptr[0] ^= ptr[3]; printf("After swap : x = %x\n", x); return 0; } .. tab-set:: .. tab-item:: Output .. code-block:: c :linenos: Before swap : x = 11223344 After swap : x = 44223311 .. _typecasting_n_ptr_sp_char_ptr_ex_7: .. tab-set:: .. tab-item:: Example 7 : Swap two bytes in an Integer using character pointer : Bitwise logic .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow How to swap two bytes in an Integer using character pointer ? .. code-block:: c :linenos: /* Program to swap byte 0 and byte 3 of an integer */ #include int main(void) { unsigned int x = 0x11223344; printf("Before swap : x = %x\n", x); ((unsigned char *) &x)[0] ^= ((unsigned char *) &x)[3]; ((unsigned char *) &x)[3] ^= ((unsigned char *) &x)[0]; ((unsigned char *) &x)[0] ^= ((unsigned char *) &x)[3]; printf("After swap : x = %x\n", x); return 0; } .. tab-set:: .. tab-item:: Output .. code-block:: c :linenos: Before swap : x = 11223344 After swap : x = 44223311 .. _typecasting_n_ptr_sp_char_ptr_ex_8: .. tab-set:: .. tab-item:: Example 8 : Swap two bytes in a Short Integer using character pointer : Bitwise logic .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow How to swap two bytes in a Short Integer using character pointer ? .. code-block:: c :linenos: :emphasize-lines: 11 /* Program to swap byte 0 and byte 1 of an integer */ #include int main(void) { unsigned short int x = 0x1122; unsigned char *ptr; // Step 1 : ptr is pointing to a block of 2 bytes ptr = (unsigned char *) &x; printf("Before swap : x = %x\n", x); ptr[0] ^= ptr[1]; ptr[1] ^= ptr[0]; ptr[0] ^= ptr[1]; printf("After swap : x = %x\n", x); return 0; } .. tab-set:: .. tab-item:: Output .. code-block:: c :linenos: Before swap : x = 1122 After swap : x = 2211 .. _typecasting_n_ptr_sp_char_ptr_ex_9: .. tab-set:: .. tab-item:: Example 9 : Swap two bytes in a Short Integer using character pointer : Bitwise logic .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow How to swap two bytes in a Short Integer using character pointer ? .. code-block:: c :linenos: /* Program to swap byte 0 and byte 1 of an integer */ #include int main(void) { unsigned short int x = 0x1122; printf("Before swap : x = %x\n", x); ((unsigned char *) &x)[0] ^= ((unsigned char *) &x)[1]; ((unsigned char *) &x)[1] ^= ((unsigned char *) &x)[0]; ((unsigned char *) &x)[0] ^= ((unsigned char *) &x)[1]; printf("After swap : x = %x\n", x); return 0; } .. tab-set:: .. tab-item:: Output .. code-block:: c :linenos: Before swap : x = 1122 After swap : x = 2211 .. _typecasting_n_ptr_sp_char_ptr_ex_10: .. tab-set:: .. tab-item:: Example 10 : Integer pointer arithmetic changes after type conversion to Chracter pointer .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Observe that Integer Pointer increments by 4 Bytes .. code-block:: c :linenos: :emphasize-lines: 9, 11 #include int main(void) { unsigned int x[] = { 0x11223344, 0x55667788, 0x99aabbcc }; unsigned int *p; p = x; // p is pointing to x[0] p++; // p is pointing to x[1] printf("*p = %x\n", *p); return 0; } .. tab-set:: .. tab-item:: Output .. code-block:: c :linenos: *p = 55667788 .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Observe that Integer Pointer is typecasted to Char Pointer and hence increments by 1 Byte .. code-block:: c :linenos: :emphasize-lines: 11, 13 #include int main(void) { unsigned int x[] = { 0x11223344, 0x55667788, 0x99aabbcc }; unsigned int *p; unsigned char *cp; p = x; // p is pointing to x[0] cp = (unsigned char *)p + 1; // cp is pointing second byte of x[0] printf("*cp = %x\n", *cp); return 0; } .. tab-set:: .. tab-item:: Output .. code-block:: c :linenos: *cp = 33 .. _typecasting_n_ptr_sp_char_ptr_ex_11: .. tab-set:: .. tab-item:: Example 11 : Manipulate Heap : Compare heap access with char and int pointer .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow * Both pointers ip and cp are pointing to a single block of 40 bytes in heap * ip can index from 0 to 9 * cp can index from 0 to 39 .. code-block:: c :linenos: :emphasize-lines: 12, 16 #include #include int main(void) { unsigned int *ip; unsigned char *cp; // Allocate heap memory of 40 bytes // ip views this as 10 integers ip = malloc(40); // cp is also pointing to memory allocated in previous line // cp views this as 40 characters cp = (unsigned char *) ip; // Change bytes 36, 37, 38, 39 using ip ip[9] = 0x11223344; printf("Changed using ip : ip[9] = %x\n", ip[9]); // Change bytes 36, 37, 38, 39 using cp cp[36] = 0xaa; cp[37] = 0xbb; cp[38] = 0xcc; cp[39] = 0xdd; printf("Changed using cp : ip[9] = %x\n", ip[9]); return 0; } .. tab-set:: .. tab-item:: Output .. code-block:: c :linenos: Changed using ip : ip[9] = 11223344 Changed using cp : ip[9] = ddccbbaa .. _typecasting_n_ptr_sp_char_ptr_ex_12: .. tab-set:: .. tab-item:: Summary ============================= ============================================================================== Learning Description ============================= ============================================================================== ptr = (unsigned char \*) &x; * Use ptr to manipulate variable x * Where x can be short integer * Where x can be integer * Where x can be structure * Where x can be union ptr = (unsigned char \*) x; * Use ptr to manipulate array x * Where x can be char array * Where x can be short integer array * Where x can be integer array * Where x can be structure array * Where x can be union array ((unsigned char \*) &x)[3]; * Access Byte 3 of variable x * Where x can be integer * Where x can be structure (of size 4 bytes atleast) * Where x can be union (of size 4 Bytes atleast) cp = (unsigned char \*)p + 1; * Access Byte 1 of memory pointed by p * Where p can be an array of any type * Where p can be a pointer of any type (pointing to memory of atleast 2 Bytes) ============================= ============================================================================== .. card:: See Also * Current Module * :doc:`typecasting_n_ptr` * Previous Module * :doc:`../malloc_ptr/malloc_ptr` * Next Module * :doc:`../funcs_n_ptrs/funcs_n_ptrs` * Other Modules * :doc:`../variable_and_ptr/variable_and_ptr` * :doc:`../array_n_ptrs/array_n_ptrs` * :doc:`../memcpy_ptr/memcpy_ptr` * :doc:`../const_ptr/const_ptr` * :doc:`../void_ptr/void_ptr` * :doc:`../array_of_ptr/array_of_ptr` * :doc:`../ptr_to_array/ptr_to_array` * :doc:`../function_ptr/function_ptr` * :doc:`../pre_incr_ptr/pre_incr_ptr` * :doc:`../post_incr_ptr/post_incr_ptr` * :doc:`../pre_decr_ptr/pre_decr_ptr` * :doc:`../post_decr_ptr/post_decr_ptr`