Solved

Tutorial: char, pointer in C

Posted on 2013-11-05
10
714 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
Comment Utility
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
Comment Utility
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
Comment Utility
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
 
LVL 8

Accepted Solution

by:
virtuadept earned 333 total points
Comment Utility
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
Comment Utility
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
What Should I Do With This Threat Intelligence?

Are you wondering if you actually need threat intelligence? The answer is yes. We explain the basics for creating useful threat intelligence.

 
LVL 8

Expert Comment

by:virtuadept
Comment Utility
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
Comment Utility
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
Comment Utility
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
Comment Utility
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
Comment Utility
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

How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

Join & Write a Comment

Little introduction about CP: CP is a command on linux that use to copy files and folder from one location to another location. Example usage of CP as follow: cp /myfoder /pathto/destination/folder/ cp abc.tar.gz /pathto/destination/folder/ab…
Go is an acronym of golang, is a programming language developed Google in 2007. Go is a new language that is mostly in the C family, with significant input from Pascal/Modula/Oberon family. Hence Go arisen as low-level language with fast compilation…
Video by: Grant
The goal of this video is to provide viewers with basic examples to understand and use nested-loops in the C programming language.
The viewer will learn how to clear a vector as well as how to detect empty vectors in C++.

771 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

Need Help in Real-Time?

Connect with top rated Experts

14 Experts available now in Live!

Get 1:1 Help Now