Pointer and address


 
Thread Tools Search this Thread
Top Forums Programming Pointer and address
# 1  
Old 05-07-2013
Pointer and address

This code is to print out the program name and arguments list one by one:
Code:
  1 #include<stdio.h>
  2 
  3 void main(int argc, char *argv[])
  4 {
  5         int iCount = 0;
  6         while (iCount < argc) {
  7                 printf("argc:%d\t%s\n",iCount, argv[iCount]);
  8                 iCount++;
  9         }
 10 }
 11

I understand it is about pointer and pointer address of the array. Can somebody explain to me why line 7 should not be as :
Code:
printf("argc:%d\t%s\n",iCount, *argv[iCount]);

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!

Last edited by yifangt; 05-07-2013 at 04:14 PM..
# 2  
Old 05-07-2013
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..
# 3  
Old 05-07-2013
Quote:
Can somebody explain
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).

Code:
printf("argc:%d\t%c\n",iCount, *argv[iCount]);

The basic answer is that argv[iCount] is compatible with %s and *argv[iCount] is compatible with %c.
This User Gave Thanks to hanson44 For This Post:
# 4  
Old 05-07-2013
pointer and address

Actually I did many similar test as you suggested, but I always got error message like:
Code:
program.c: In function ‘main':
program.c:7:3: warning: format ‘%c' expects argument of type ‘int', but argument 3 has type ‘char *' [-Wformat]

I think this is the point that I did not catch
Code:
argv [iCount] , The content  happens to be an address,

My confusion was also with a similar code I was trying:
Code:
1 #include<stdio.h>
  2 
  3 void Print(char *[]);
  4 void main()
  5 {
  6         char * pn[] = {"Fred", "Barney", "Betty", "Wilma", NULL};
  7         Print(pn);
  8 }
  9 void Print(char * arr[])
 10 {
 11         while (*arr != NULL) {
 12                 printf("arr %p \t %s\n", &arr, *arr);
 13                 arr++;
 14         }
 15 }

In this code line 12 was what I expected and printed out correct thing.
and the output is:
Code:
arr 0x7fffd4f3bb58      Fred
arr 0x7fffd4f3bb58      Barney
arr 0x7fffd4f3bb58      Betty
arr 0x7fffd4f3bb58      Wilma

Why this time in line 12 *arr was used instead of arr?
# 5  
Old 05-07-2013
Yes, %s is for char*, a pointer to a null terminated string like "Hi!", a pass by reference

but %c is for just one char, like '!'. A char is 8 bits treated as an unsigned integer and passed here by value, just like int to %d.
# 6  
Old 05-07-2013
Quote:
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:
Code:
$ cat array.c
#include<stdio.h>

void main(int argc, char *argv[])
{
        int iCount;

        for (iCount = 0; iCount < argc; iCount++) {
                printf("argc:%d\t%s\n",iCount, argv[iCount]);
        }
        for (iCount = 0; iCount < argc; iCount++) {
                printf("argc:%d\t%c\n",iCount, *argv[iCount]);
        }
        for (iCount = 0; iCount < argc; iCount++) {
                printf("argc:%d\t%c\n",iCount, argv[iCount][0]);
        }
}

Code:
$ gcc array.c
$ a.out 123 xyz
argc:0  a.out
argc:1  123
argc:2  xyz
argc:0  a
argc:1  1
argc:2  x
argc:0  a
argc:1  1
argc:2  x

The second two loops are doing exactly the same thing, just written two different ways, *argv[iCount] and argv[iCount][0]
This User Gave Thanks to hanson44 For This Post:
# 7  
Old 05-07-2013
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,
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Advanced & Expert Users

C program to detect duplicate ip address if any after assigning ip address to ethernet interface

Hi , Could someone let me know how to detect duplicate ip address after assigning ip address to ethernet interface using c program (3 Replies)
Discussion started by: Gopi Krishna P
3 Replies

2. UNIX for Dummies Questions & Answers

Printing pointer address

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)
Discussion started by: perleo
5 Replies

3. IP Networking

Tracing a MAC address to IP address: Solaris

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)
Discussion started by: notreallyhere
9 Replies

4. UNIX for Dummies Questions & Answers

Panic kernal-mode address fault on user address 0x14

:) 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)
Discussion started by: Twix
10 Replies

5. Shell Programming and Scripting

ksh - how to list all ip address between 2 ip address

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)
Discussion started by: frustrated1
4 Replies

6. Programming

pass a pointer-to-pointer, or return a pointer?

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)
Discussion started by: aaronwong
11 Replies

7. Programming

address of pointer

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)
Discussion started by: Poison Ivy
19 Replies

8. Programming

A Pointer to non-Virtual Address, and All of my Hard drive

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)
Discussion started by: xcoder66
9 Replies

9. IP Networking

How to Achive IP address through MAC(Ethernet) address

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)
Discussion started by: krishnacins
3 Replies

10. UNIX for Dummies Questions & Answers

network address and broadcast address?

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)
Discussion started by: pnxi
7 Replies
Login or Register to Ask a Question