Solved

Tutorial: char, pointer in C

Posted on 2013-11-05
10
738 Views
Last Modified: 2013-11-05
Dear Expert,

Recently , I am studing  PHP explode() fuction convert C
at http://www.it.uu.se/katalog/larme597/explode
in which the example of explode() is working fine and but I
can not follow how it works.
Since I am not familar with C so I get the following simple  basic questions.

For example, my code testing in C
#include <stdio.h>
int main (){
char h='a';
printf("=%c=  =%d=  =%d=\n",h,h,&h,);
// it will output  "=a=   =97=   =1387254251="
//My question  &h  is address of char, h, but what is number of 97 stand for ?

char *g ="bc";
printf("=%c=   =%c=   =%d=  =%d= \n",*g,*(g+1),g,&g);
//it will output "=b=  =c=  =4196522=  =138725240="
//My question  &g is address of pointer to g ?
//My question what is 4196522 stand for ?
//Why *(g+1) can get the second character of ("bc") ? whether g is address of the char
// or &g is address of char ?  


}


I'm using gcc on 64 bit CentOS Linux


Please advise

Duncan
0
Comment
Question by:duncanb7
  • 5
  • 4
10 Comments
 
LVL 8

Assisted Solution

by:virtuadept
virtuadept earned 333 total points
ID: 39625052
97 is the decimal representation of ascii character a (lower case A).

&g is the address of the pointer to g.

4196522 is the address that *g points to.

*(g + 1) means add 1 to the address of g and return its value, which gives you c because the next byte contains a "c" character.

I hate pointer arrithmetic and not every language supports it.
0
 
LVL 16

Assisted Solution

by:HooKooDooKu
HooKooDooKu earned 167 total points
ID: 39625062
A char is really just an integer variable with a range of -128 to 127.
The line
    printf("=%c=  =%d=  =%d=\n",h,h,&h,);
is saying to print the variable value of h as a character, then as an integer, then finally the address of the variable as an integer.

In the case of
  char *g ="bc";
the text "bc" is a hard-coded string that will exist somewhere in the data of the program, and g is now a pointer to that string.  Technically, g is a pointer to the 1st character of the string.
The line
  printf("=%c=   =%c=   =%d=  =%d= \n",*g,*(g+1),g,&g);
is saying to print what g points to as a character (so you get the 1st character of the string)
and print what is 1 byte past what g points to as a character (so you get the 2nd character of the string)
It then says to print the value of g (a pointer) as an integer, and then print the address of g (a pointer to a pointer) as an integer.
0
 
LVL 13

Author Comment

by:duncanb7
ID: 39625086
g and h in printf with %d have different interpretation since g is pointer to char,
so *(g+1) can locate the second char of ("bc"), Right ?

I search it in goole, the example link is the best to
do explode() in C.
Those ***arr or  arr[] or pointer address arithemtic or pointer of potiner made me
to lose track to the code.

So now I try to get it detail to printf out every step as debugger.
C is much faster than PHP in speed as ASM lanauage  (if no doing DOM access) and can
handle a lot of memory allocation and data structure .

But C is  not easy  to be remembered that I used it before in long long time ago
and C  sytnax is easy to forget
0
Master Your Team's Linux and Cloud Stack

Come see why top tech companies like Mailchimp and Media Temple use Linux Academy to build their employee training programs.

 
LVL 8

Accepted Solution

by:
virtuadept earned 333 total points
ID: 39625102
correct, g was defined as a char* which is a pointer to a character. h was defined as a character. so g is just an address that points at a the first byte of memory that will contain the character values "bc". That is why you can do *(g+1) to get the 2nd character.

In C that is not typically how programs do string manipulation. Usually a char* will be terminated with a null (\0) and that is how the C string functions know the end of the contiguous block of bytes representing characters that are the "string".

I could be remembering wrong but you might could also reference the "c" in "bc" with g[1] treating the char* as an array of characters. g[0] would be "b". That may depend on the C implementation.
0
 
LVL 13

Author Comment

by:duncanb7
ID: 39625157
it is good

I can let the g char pointe into g[0] or g[1], sometimes, I don't know why it can
go into array.
Anyway let me try it before closing this thread.


I will open new thread for the example link, please look into it
http://www.it.uu.se/katalog/larme597/explode
Duncan
0
 
LVL 8

Expert Comment

by:virtuadept
ID: 39625165
I did look at the example. It is taking a string and converting it into an array of strings. Or in this case, a pointer to character and converting it to an array of pointers to characters. Is something in that example not working for you?
0
 
LVL 13

Author Comment

by:duncanb7
ID: 39625176
I can run the example sucessfully but I don't understand how it works for every code step
so I will made new thread for it instead of this thread

Anyway, I will do the array first as your suggestion and close this thread

Duncan
0
 
LVL 13

Author Comment

by:duncanb7
ID: 39625209
I tried char *g="bc";

printf("%c\n", g[0]) will echo out "b";

so it is not need for declaration as  array such as

char *g[]="bc"; Why  no need ?



Duncan
0
 
LVL 13

Author Closing Comment

by:duncanb7
ID: 39625215
Thanks for you reply

And you answer me the final questioon

and check my new thread of explode.c
0
 
LVL 8

Expert Comment

by:virtuadept
ID: 39625398
The reason you do not have to declare g as an array before referencing g[0] is because in C (or at least, in most implementations of C I've ever used), C automatically knows how to dereference char * variables as arrays of character, its kind of a built in feature.

So char* g = "bc"

printf("%c %c %c %c", *g, *(g+1), g[0], g[1]);

prints: b c b c

a g[1] translates to *(g+1) when dealing with pointer to character (pointers to bytes, essentially).

and g[x] translates to *(g+x) where x is an offset in bytes from the original starter position of the character pointer.

Note that if you wrote this:

char *g = "ab"

printf("%c", g[2]);
or
printf("%c", *(g+2);

Depending on the compiler you may get an error or may get a run time error because you are attempting to reference memory outside the boundary for  char *g.

And if it does not error, it could produce unpredictable results. Whatever happens to be stored in the memory location 2 bytes after *g will be converted to char and printed.

On most OS if this causes you to attempt to read a part of memory not allocated to your program, you will get a memory access violation error.
0

Featured Post

Free Tool: IP Lookup

Get more info about an IP address or domain name, such as organization, abuse contacts and geolocation.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

It’s 2016. Password authentication should be dead — or at least close to dying. But, unfortunately, it has not traversed Quagga stage yet. Using password authentication is like laundering hotel guest linens with a washboard — it’s Passé.
Examines three attack vectors, specifically, the different types of malware used in malicious attacks, web application attacks, and finally, network based attacks.  Concludes by examining the means of securing and protecting critical systems and inf…
The viewer will learn how to user default arguments when defining functions. This method of defining functions will be contrasted with the non-default-argument of defining functions.
The viewer will be introduced to the technique of using vectors in C++. The video will cover how to define a vector, store values in the vector and retrieve data from the values stored in the vector.

839 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question