This code is to print out the program name and arguments list one by one:
I understand it is about pointer and pointer address of the array. Can somebody explain to me why line 7 should not be as :
I thought *argv[iCount] is the correct way as argv[iCount] is one of the array members address, not the content of the pointer pointing to. But my understanding is wrong! What did I miss? Thanks a lot!
argv is an array of pointers to arrays of char, so first think of it at char**, something that needs one dereferencing ( * or [#] ) to get to char*, which C uses as string. The actual rules for argv is that the last element is a null pointer, so you can size it somewhat analagous to strlen(). The argc is just for your convenience, provided by the loader. char** could be char[][] which is a 2 dimensional heap of characters locally, but the name would still need dereferencing. Since printf's '%s' demands a char*, one layer of dereferencing is right. Another way to think of '*' is '[0]', so **argv is the first char of argv[0], is argv[0][0]. Array names are of type type* even if the array is local, but local arrays have size of the array not size of a pointer. So, 'char *x = "Y" ;' is a local pointer variable initialized with a pointer size 4 to a constant string, two hunks of storage, but 'char x[] = "Y" ;' is a local array size 2 of characters Y and null (sized implicitly by the initializer), one small hunk of storage, and there is no pointer storage, just an array name that is always a pointer.
Last edited by DGPickett; 05-07-2013 at 04:35 PM..
Suppose you had "int int_array [12]". Then "int_array [n]" would be an int.
argv is declared as "char *argv []" So "argv [n]" is a "char *".
"char *" is what "printf %s" expects and what makes sense, because you are trying to print a string.
"argv [iCount]" is the content of an array slot. The content happens to be an address, because "char *" is an address.
Suppose "argv [1]" is "123456". Then "*argv [1]" is '1', the single character 1. You could do an experiment and change the code to the following and verify this (untested).
The basic answer is that argv[iCount] is compatible with %s and *argv[iCount] is compatible with %c.
Actually I did many similar test as you suggested, but I always got error message like:
I think this is the point that I did not catch
My confusion was also with a similar code I was trying:
In this code line 12 was what I expected and printed out correct thing.
and the output is:
Why this time in line 12 *arr was used instead of arr?
Why this time in line 12 *arr was used instead of arr
Because arr[0] is exactly the same as *arr
In general, arr[i] is exactly the same as *(arr + 1)
This is one of the most difficult and fundamental concepts of C programming. It took me years of reading and re-reading to "get it". You need to keep at this, because it's so important to understand pointers and arrays.
char *arr[] is an array of pointers. The loop keeps incrementing the address of the start of the array. Each time, it tests the contents of the first element, and if == NULL stops the loop. Each time, it prints the contents of the first element of the array, because *arr and arr[0] mean the same thing.
--------------------------------
Quote:
I always got error message like:
If you can compile, run, and understand this, it will likely help:
The second two loops are doing exactly the same thing, just written two different ways, *argv[iCount] and argv[iCount][0]
Thanks a lot! I had thought I had understood pointer, but actually not at all!
Can I say the address of a pointer is an array of char there in these two cases (strings!)? In the second sample *arr was printed out by looping thru the actual char array, but argv[iCount] was not looped thru, where *argv[iCount] was only the first char of its contents. Is this correct?
Thank you so much,
How can I print the memory address of a pointer using printf (or any other STDOUT functions?). I see in Linux its %p but not in unix, help?
thanks (5 Replies)
Hi there
I lost connectivity to one of our remote systems and when I checked the messages log I found the following:
Aug 10 23:42:34 host xntpd: time reset (step) 1.681729 s
Aug 16 13:20:51 host ip: WARNING: node "mac address" is using our IP address x.x.x.x on aggr1
Aug 16 13:20:51 host... (9 Replies)
:) Firstly Hi all!!, im NEW!! and on here hoping that someone might be able to offer me some help... i have a server that keeps crashing every few days with the error message:
PANIC KERNAL-MODE ADDRESS FAULT ON USER ADDRESS 0X14
KERNAL PAGE FAULT FROM (CS:EIP)=(100:EF71B5BD)
EAX=EF822000... (10 Replies)
Trying to do a ksh script that needs to list all ip address between ip address a and b ..
ie.
Ip address A=192.168.1.200
Ip address B=192.168.2.15
So the subnet changes from 1 to 2 but I want to list all possible ip addresses between the 2..
Which would be:
192.168.1.200... (4 Replies)
If one wants to get a start address of a array or a string or a block of memory via a function, there are at least two methods to achieve it:
(1) one is to pass a pointer-to-pointer parameter, like:
int my_malloc(int size, char **pmem)
{
*pmem=(char *)malloc(size);
if(*pmem==NULL)... (11 Replies)
Hi i'm new to c programming and i'm trying to change the address of a pointer/variable but i can't seem to get it right,
I have this
char heap;
char *firstFree = heap;
char *allocMem( int size ) {
void *malloc(size_t sizeofint);
/*allocate space for an array with size... (19 Replies)
How do I get a pointer to any 32 bit address on my hard drive, in which I then could read that memory or write to that memory address?
And, while the subject is on, how do get a 32 bit pointer in RAM also, in which I can do the same?
I'm using C and Objective-C with gcc on an iBook G4.
A... (9 Replies)
Hi sir,
i want to make such programe which takes MAC(Ethernet) address of any host & give me its IP address.......
but i'm nt getting that how i can pass the MAC address to Frame........
Please give me an idea for making such program...
Thanks & regards
Krishna (3 Replies)
say I have a IP address which is 10.0.0.12, and subnet mask is 255.255.255.240, what is the network address and what is the broadcast address which host lives on?
And could you explain how to get the answer?
thanx in advance! (7 Replies)