In this chapter, we will study the difference between character array and character pointer.
Consider the following example:
1 2 |
char arr[] = "Hello World"; // array version char ptr* = "Hello World"; // pointer version |
Can you point out similarities or differences between them ?
The similarity is:
The type of both the variables is a pointer to char
or (char*)
, so you can pass either of them to a function whose formal argument accepts an array of characters or a character pointer.
Here are the differences:
arr
is an array of12
characters. When compiler sees the statement:
1char arr[] = "Hello World";
It allocates12
consecutive bytes of memory and associates the address of the first allocated byte witharr
.On the other hand when the compiler sees the statement.
1char ptr* = "Hello World";It allocates
12
consecutive bytes for string literal"Hello World"
and4
extra bytes for pointer variableptr
. And assigns the address of the string literal toptr
. So, in this case, a total of14
bytes are allocated.- We already learned that name of the array is a constant pointer. So if
arr
points to the address2000
, until the program ends it will always point to the address2000
, we can’t change its address. This means string assignment is not valid for strings defined as arrays.1arr = "Yellow World"; // WrongOn the contrary,
ptr
is a pointer variable of typechar
, so it can take any other address. As a result string, assignments are valid for pointers.1ptr = "Yellow World"; // ok
After the above assignment,ptr
points to the address of"Yellow World"
which is stored somewhere in the memory.Obviously, the question arises so how do we assign a different string to
arr
?We can assign a new string to
arr
by usinggets()
,scanf()
,strcpy()
or by assigning characters one by one.12345678910111213gets(arr);scanf("%s", arr);strcpy(arr, "new string");arr[0] = 'R';arr[1] = 'e';arr[2] = 'd';arr[3] = ' ';arr[4] = 'D';arr[5] = 'r';arr[6] = 'a';arr[7] = 'g';arr[8] = 'o';arr[9] = 'n'; - Recall that modifying a string literal causes undefined behavior, so the following operations are invalid.
123456char *ptr = "Hello";ptr[0] = 'Y'; or *ptr = 'Y';gets(name);scanf("%s", ptr);strcpy(ptr, "source");strcat(ptr, "second string");
- Using an uninitialized pointer may also lead to undefined undefined behavior.
1char *ptr;
Here
ptr
is uninitialized an contains garbage value. So the following operations are invalid.12345ptr[0] = 'H';gets(ptr);scanf("%s", ptr);strcpy(ptr, "source");strcat(ptr, "second string");We can only use
ptr
only if it points to a valid memory location.12char str[10];char *p = str;Now all the operations mentioned above are valid. Another way we can use ptr is by allocation memory dynamically using
malloc()
orcalloc()
functions.123char *ptr;ptr = (char*)malloc(10*sizeof(char)); // allocate memory to store 10characters
Let’s conclude this chapter by creating dynamic 1-d array of characters.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
#include<stdio.h> #include<stdlib.h> int main() { int n, i; char *ptr; printf("Enter number of characters to store: "); scanf("%d", &n); ptr = (char*)malloc(n*sizeof(char)); for(i=0; i < n; i++) { printf("Enter ptr[%d]: ", i); /* notice the space preceding %c is necessary to read all whitespace in the input buffer */ scanf(" %c", ptr+i); } printf("\nPrinting elements of 1-D array: \n\n"); for(i = 0; i < n; i++) { printf("%c ", ptr[i]); } // signal to operating system program ran fine return 0; } |
Expected Output:
1 2 3 4 5 6 7 8 9 10 11 |
Enter number of characters to store: 6 Enter ptr[0]: a Enter ptr[1]: b Enter ptr[2]: c Enter ptr[3]: d Enter ptr[4]: y Enter ptr[5]: z Printing elements of 1-D array: a b c d y z |
What is pointer & it’s charactor
Poniter is used to point address of its data type(like int pointer will point to intiger data type and char pointer will point to char data type).
should ptr from: char ptr* = “Yello World” only store an additional byte, since ptr is of type char. You said it’s an additional 4 bytes.;
pointers are 4 bytes regardless of the type they point at. a int pointer is 4 bytes a char pointer is also 4 bytes