Arjun Suresh (talk | contribs) m (Arjun Suresh moved page Chapter 3 to Chapter 3: Pointers) |
Arjun Suresh (talk | contribs) |
||
Line 19: | Line 19: | ||
scanf("%d",p); | scanf("%d",p); | ||
printf("a = %d *p = %d", a, *p); | printf("a = %d *p = %d", a, *p); | ||
+ | |||
+ | |||
+ | =Exercise Questions= | ||
+ | {{:C_Questions_on_Pointers}} | ||
+ | |||
+ | |||
+ | |||
+ | {{Template:FBD}} | ||
+ | |||
+ | |||
+ | |||
+ | [[Category: Book on C]] |
Pointer as the word implies just points. It is a datatype in C which is used to hold memory address. Pointers may point to any datatype in C and based on that pointer arithmetic is done.
A pointer is declared using * as follows:
int* p; //p is a pointer to int. int *p is also syntactically correct but * here is always taken with int as int* and p is the name for the variable. Many take this as *p which is not correct char* y; //y is a pointer to char
Actually pointer operation is very simple as there are just two operators for using pointer.
What is the content depends on the type of p. If p is an integer pointer, *p will return 4 bytes from the location contained in p. If p is a char pointer *p will return 1 byte from the location in p.
int *p, a; scanf("%d",&a); //memory address of a is passed to scanf and it stores the keyboard entered value in that location p = &a; //Memory address of a is stored in p printf("*p = %d", *p); //Content of p is printed by printf. Since %d is used, 4 bytes (assuming sizeof int is 4) from the memory location given by p is converted to integer and printed.
int *p, a; p = &a; scanf("%d",p); printf("a = %d *p = %d", a, *p);
<quiz display="simple"> {What will be the output of the following code? <syntaxhighlight lang="c">
int main() {
int a = 5; int* p = &a; printf("%d", ++*p);
} </syntaxhighlight> |type="{}" /} { 6 } ||p is pointing to the address of a. *p will return the content of a which is 5 and ++ will increment it to 6.
{What will be the output of the following code?
<syntaxhighlight lang="c">
int main() {
char a[] = "Hello World"; char* p = &a; printf("%s", p+2 );
} </syntaxhighlight> |type="()" /} -Compiler Error -World +llo World -Runtime Error
||Since p is a char pointer p+2 will add 2 to p (since sizeof(char) is 1). So, p+2 will be pointing to the string "llo World".
{What will be the output of the following code? <syntaxhighlight lang="c">
int main() {
int a; int* p = &a; printf("%zu", sizeof( *(char*)p ));
} </syntaxhighlight> |type="()" /}
+1 -2 -4 -Compile Error
||p is typecasted to char pointer and then dereferenced. So, returned type will be char and sizeof(char) is 1.
{Is the following code legal? <syntaxhighlight lang="c">
int main() {
int a = 1; if((char*) &a) { printf("My machine is little endian"); } else { printf("My machine is big endian\n"); }
} </syntaxhighlight> |type="()" /} +Yes -No ||On a little endian machine the lower address will contain the least significant byte. Suppose a is stored at address 1000 and contains 1, then character at 1000 will be 1, if the machine is little endian.
{What will be the output of the following code? <syntaxhighlight lang="c">
int main() {
int *a = (int*) 1; printf("%d", a);
} </syntaxhighlight> |type="()" /} -Garbage value +1 -0 -Compile error -Segmentation fault ||Assigning int values to pointer variable is possible. Only when we dereference the variable using *, we get a segmentation fault.
{What will be the output of the following code? <syntaxhighlight lang="c">
int main() {
int a = 1, *p, **pp; p = &a; pp = p; printf("%d", **pp);
} </syntaxhighlight> |type="()" /} -Garbage value -1 -Compile error +Segmentation fault ||Here, p is having address of a and the same is copied to pp. So, *pp will give 1 which is contained in a, but **p will use 1 as an address and tries to access the memory location 1, giving segmentation fault.
{What will be the output of the following code? <syntaxhighlight lang="c">
int main() {
int a = 1, *p, **pp; p = &a; pp = p; printf("%d", *pp);
} </syntaxhighlight> |type="()" /} +1 -Garbage value -Compile error -Segmentation fault ||Here, p is having address of a and the same is copied to pp. So, *pp will give 1 which is contained in a.
{Assuming a little endian machine, what will be the output of the following program?
<syntaxhighlight lang="c">
fun(int a) {
char *arr[] = {"0000", "0001","0010","0011","0100","0101","0110","0111","1000","1001","1010","1011","1100","1101","1110","1111"}; unsigned char* p = (unsigned char*) &a ; p+=3; int i; for(i = 0; i < sizeof a; i++) { int d = (*p)>>4; printf("%s", arr[d]); d = (*p) & 0xf; printf("%s ", arr[d]); p--; }
}
int main() {
int a; scanf("%d", &a); fun(a);
} </syntaxhighlight> |type="()" /} +Print the binary of the input number -Compile error -Runtime error -Compiler dependent output ||The code is printing the binary equivalent of the input number. Suppose a is stored starting from address 1000. Since, we assume a little endian machine, the LSB of a will be stored at address 1000 and MSB will be stored at address 1003. So, we make a char pointer to 1003 and take out the MSB. Then using shift operator we get the most significant 4 bits from it and then the lest significant 4 bits. We repeat the same for the other three bytes of a. </quiz>
Pointer as the word implies just points. It is a datatype in C which is used to hold memory address. Pointers may point to any datatype in C and based on that pointer arithmetic is done.
A pointer is declared using * as follows:
int* p; //p is a pointer to int. int *p is also syntactically correct but * here is always taken with int as int* and p is the name for the variable. Many take this as *p which is not correct char* y; //y is a pointer to char
Actually pointer operation is very simple as there are just two operators for using pointer.
What is the content depends on the type of p. If p is an integer pointer, *p will return 4 bytes from the location contained in p. If p is a char pointer *p will return 1 byte from the location in p.
int *p, a; scanf("%d",&a); //memory address of a is passed to scanf and it stores the keyboard entered value in that location p = &a; //Memory address of a is stored in p printf("*p = %d", *p); //Content of p is printed by printf. Since %d is used, 4 bytes (assuming sizeof int is 4) from the memory location given by p is converted to integer and printed.
int *p, a; p = &a; scanf("%d",p); printf("a = %d *p = %d", a, *p);
<quiz display="simple"> {What will be the output of the following code? <syntaxhighlight lang="c">
int main() {
int a = 5; int* p = &a; printf("%d", ++*p);
} </syntaxhighlight> |type="{}" /} { 6 } ||p is pointing to the address of a. *p will return the content of a which is 5 and ++ will increment it to 6.
{What will be the output of the following code?
<syntaxhighlight lang="c">
int main() {
char a[] = "Hello World"; char* p = &a; printf("%s", p+2 );
} </syntaxhighlight> |type="()" /} -Compiler Error -World +llo World -Runtime Error
||Since p is a char pointer p+2 will add 2 to p (since sizeof(char) is 1). So, p+2 will be pointing to the string "llo World".
{What will be the output of the following code? <syntaxhighlight lang="c">
int main() {
int a; int* p = &a; printf("%zu", sizeof( *(char*)p ));
} </syntaxhighlight> |type="()" /}
+1 -2 -4 -Compile Error
||p is typecasted to char pointer and then dereferenced. So, returned type will be char and sizeof(char) is 1.
{Is the following code legal? <syntaxhighlight lang="c">
int main() {
int a = 1; if((char*) &a) { printf("My machine is little endian"); } else { printf("My machine is big endian\n"); }
} </syntaxhighlight> |type="()" /} +Yes -No ||On a little endian machine the lower address will contain the least significant byte. Suppose a is stored at address 1000 and contains 1, then character at 1000 will be 1, if the machine is little endian.
{What will be the output of the following code? <syntaxhighlight lang="c">
int main() {
int *a = (int*) 1; printf("%d", a);
} </syntaxhighlight> |type="()" /} -Garbage value +1 -0 -Compile error -Segmentation fault ||Assigning int values to pointer variable is possible. Only when we dereference the variable using *, we get a segmentation fault.
{What will be the output of the following code? <syntaxhighlight lang="c">
int main() {
int a = 1, *p, **pp; p = &a; pp = p; printf("%d", **pp);
} </syntaxhighlight> |type="()" /} -Garbage value -1 -Compile error +Segmentation fault ||Here, p is having address of a and the same is copied to pp. So, *pp will give 1 which is contained in a, but **p will use 1 as an address and tries to access the memory location 1, giving segmentation fault.
{What will be the output of the following code? <syntaxhighlight lang="c">
int main() {
int a = 1, *p, **pp; p = &a; pp = p; printf("%d", *pp);
} </syntaxhighlight> |type="()" /} +1 -Garbage value -Compile error -Segmentation fault ||Here, p is having address of a and the same is copied to pp. So, *pp will give 1 which is contained in a.
{Assuming a little endian machine, what will be the output of the following program?
<syntaxhighlight lang="c">
fun(int a) {
char *arr[] = {"0000", "0001","0010","0011","0100","0101","0110","0111","1000","1001","1010","1011","1100","1101","1110","1111"}; unsigned char* p = (unsigned char*) &a ; p+=3; int i; for(i = 0; i < sizeof a; i++) { int d = (*p)>>4; printf("%s", arr[d]); d = (*p) & 0xf; printf("%s ", arr[d]); p--; }
}
int main() {
int a; scanf("%d", &a); fun(a);
} </syntaxhighlight> |type="()" /} +Print the binary of the input number -Compile error -Runtime error -Compiler dependent output ||The code is printing the binary equivalent of the input number. Suppose a is stored starting from address 1000. Since, we assume a little endian machine, the LSB of a will be stored at address 1000 and MSB will be stored at address 1003. So, we make a char pointer to 1003 and take out the MSB. Then using shift operator we get the most significant 4 bits from it and then the lest significant 4 bits. We repeat the same for the other three bytes of a. </quiz>