Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

character pointer takes the address of what

Tags:

c

I read that:

char a[] = "string"; 

is a: "string"

whereas

char *ptr = "string" 

is ptr: [__] ---> "string"

I am little confused. One thing I know is that pointers always store the address. In case of character pointer what address does it store? What does this block represent (block which I made pointing to string). Is it the starting address of the "string".

And in case of array? How can I clearly differentiate between char pointer and char array?

like image 795
Stack Overflow 32 Avatar asked Sep 10 '14 00:09

Stack Overflow 32


People also ask

What is a character pointer?

Here p,s and q are character pointers. As we know pointers store the address of a variable and suppose if we used p=str1 then it should store the base address of array str1. Then here how p is acting like an array itself which is storing a string? I've not really understood what's character pointer. Is it not really a pointer?

How to get the address of next character in a char?

Here, ptr is pointer to char so, ptr+1 will give address of next character and * (ptr + 1) give the character at that location. That's why to the user it looks like its acting like an array. Because we are not using & and neither are we getting the address as an output.

Is P a character pointer or array?

You can say p is acting like an array but in reality, it is just a pointer which is pointing to the base address of string str1 which is a null-terminated string. I've not really understood what's character pointer. Is it not really a pointer? A character pointer is again a pointer like the pointers to other types in C.

What is the size of character pointer in C language?

Since the content of any pointer is an address, the size of all kinds of pointers ( character, int, float, double) is 4. In the next article, I am going to discuss Pointer to Constant in C language. Here, in this article, I try to explain Character Pointer in C.


2 Answers

Diagrams may help.

char *ptr = "string";

+-------+          +----------------------------+
|  ptr  |--------->| s | t | r | i | n | g | \0 |
+-------+          +----------------------------+

char a[] = "string";

+----------------------------+
| s | t | r | i | n | g | \0 |
+----------------------------+

Here, ptr is a variable that holds a pointer to some (constant) data. You can subsequently change the memory address that it points at by assigning a new value to ptr, such as ptr = "alternative"; — but you cannot legitimately change the contents of the array holding "string" (it is officially readonly or const, and trying to modify it may well crash your program, or otherwise break things unexpectedly).

By contrast, a is the constant address of the first byte of the 7 bytes of data that is initialized with the value "string". I've not shown any storage for the address because, unlike a pointer variable, there isn't a piece of changeable storage that holds the address. You cannot change the memory address that a points to; it always points to the same space. But you can change the contents of the array (for example, strcpy(a, "select");).

When you call a function, the difference disappears:

if (strcmp(ptr, a) == 0)
    …string is equal to string…

The strcmp() function takes two pointers to constant char data (so it doesn't modify what it is given to scrutinize), and both ptr and a are passed as pointer values. There's a strong case for saying that only pointers are passed to functions — never arrays — even if the function is written using array notation.

Nevertheless, and this is crucial, arrays (outside of paramter lists) are not pointers. Amongst other reasons for asserting that:

  • sizeof(a) == 7
  • sizeof(ptr) == 8 (for 64-bit) or sizeof(ptr) == 4 (32-bit).
like image 138
Jonathan Leffler Avatar answered Sep 23 '22 20:09

Jonathan Leffler


In case of character pointer what address does it store? What does this block represent (block which I made pointing to string). Is it the starting address of the "string".

This blocks represents a WORD or DWORD (achitecture dependant), the content of this block is a memory address, a random location defined at compile time. That memory address is the address of first character of the string.

In practice, the difference is how much stack memory it uses.

For example when programming for microcontrollers where very little memory for the stack is allocated, makes a big difference.

char a[] = "string"; // the compiler puts {'s','t','r','i','n','g', 0} onto STACK 

char *b = "string"; // the compiler puts just the pointer onto STACK 
                    // and {'s','t','r','i','n','g',0} in static memory area.

Maybe this will help you understand.

assert(a[0] == 's'); // no error.
assert(b[0] == 's'); // no error.
assert(*b == 's');   // no error.
b++; // increment the memory address, so points to 't'
assert(*b == 's');   // assertion failed
assert(*b == 't');   // no error.
like image 45
rnrneverdies Avatar answered Sep 23 '22 20:09

rnrneverdies