|
Hi Iain,
I have tested that buf and &buf are of the same value -- means same effect. Here is my program to test. Any comments?
int main()
{
char buf[] = "Hello World";
int p1 = buf;
int p2 = &buf;
return 0;
}
regards,
George
|
|
|
|
|
CPallini's answer was good, and correct.
All it means though is the value of array and &array are the same as C nicely hacks it that way.
BUT...
They are of different types, as no doubt C will complain if you try to do this...
char array [] = "hello world";
char *p;
char **pp
p = array;
ASSERT(*p == 'h';
p = &array;
pp = &array;
ASSERT(**p == 'h');
Getting there?
Iain.
|
|
|
|
|
Actually:
Iain Clarke wrote: char array [] = "hello world";
char *p;
char **pp
p = array; // happy
ASSERT(*p == 'h';
p = &array; // not happy.
is OK, while
Iain Clarke wrote:
char **pp;
pp = &array;
ASSERT(**p == 'h');
is NOT so OK!
It is a very tricky topic...
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
|
|
|
|
|
Hi Iain,
I have tested that this line,
pp = &array;
also can not compile. I am using Visual Studio 2008 and C compiler.
regards,
George
|
|
|
|
|
I think Cpallini has pretty thoroughly covered the whole field of pointers to arrays.
And while my answers may have been longer, his are that little bit more accurate with respect to &array.
If it doesn't compile, then the error message you get should be worth a read.
It's probably worth understanding pointers before you go back to socket questions!
Iain.
|
|
|
|
|
Thanks for your advice, Iain!
regards,
George
|
|
|
|
|
Iain Clarke wrote: So, &array is a pointer to a pointer to chars.
Your argument is good when applied on standard pointers. On the other hand, the address-of operator has a strange behaviour whenever is applied to array identifiers.
See, for instance.
http://www.fredosaurus.com/notes-cpp/arrayptr/arraysaspointers2.html[^]
You can also make a little test.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
|
|
|
|
|
&array is a pointer to an array pointer:
int values[] = { 10, 20, 30, 40, 55, 60, 70, 80, 90, 100 };
int (*pval)[10] = &values;
wcout << *pval[0] << endl;
wcout << **pval << endl;
"We make a living by what we get, we make a life by what we give." --Winston Churchill
|
|
|
|
|
Thanks George,
I do not understand why **pval is the same as *pval[0]? I think *pval should be the same as *pval[0]. But during testing, you are correct. Why?
regards,
George
|
|
|
|
|
pval[0] is a pointer to the first value and *pval[0] is the first value. pval is a pointer-to-a-array pointer. *pval dereferences to an array pointer and **pval dereferences to the first value. So, to get the second value using both:
wcout << *(*pval + 1) << endl;
wcout << *(pval[0] + 1) << endl;
"We make a living by what we get, we make a life by what we give." --Winston Churchill
|
|
|
|
|
Cool, thanks George!
regards,
George
|
|
|
|
|
George_George wrote: Sometimes, I noticed that we either use,
1. array (buf)
or use,
2. &array (&buf)
or use
3. &array[0] (&buf[0])
Where have you seen this convention? I certainly don't profess to being a C expert, but I've never used nor have I ever seen this syntax before.
"Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
DavidCrow wrote: 1. array (buf)
Probably (I'm guessing), with the above notation he means
array
or
buf
an so on.
If it stands then the syntax (apart of case (2)) it is used quite a lot.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
|
|
|
|
|
CPallini wrote: If it stands then the syntax (apart of case (2)) it is used quite a lot.
How, since it is syntactically incorrect?
"Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
The syntax is in fact correct.
For instance, if you have
char array[] = "hello world";
all the three following statements are syntactically (and semantically) correct:
(1)
printf("%s\n", array);
(2)
printf("%s\n", &array);
(3)
printf("%s\n", &array[0]);
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
|
|
|
|
|
But none of array(buf) , &array(&buf) , or &array[0](&buf[0]) are correct.
"Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
DavidCrow wrote: But none of array(buf), &array(&buf), or &array[0](&buf[0]) are correct.
Sure.
I think you missed the meaning of my previous reply http://www.codeproject.com/script/Forums/View.aspx?fid=1647&msg=2352543[^]
I assume (or, better, I'm guessing...) that he is using
array(buf)
as a shortucut to say that the same argument appliese both to array and buffer . For example, if I write the following sentence:
a number is even (odd) if, divided by two, gives 0 (1) as reminder.
then I'm obviously meaning:
(1) a number is even if, divided by two, gives 0 as reminder.
(2) a number is odd if, divided by two, gives 1 as reminder.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
|
|
|
|
|
But they are not equivalent!
"We make a living by what we get, we make a life by what we give." --Winston Churchill
|
|
|
|
|
Well they aren't strictly equivalent (if you'll read all current thread posting then you'll find some links to related documentation), anyway the three statements produce the same result.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
|
|
|
|
|
The three statements don't always produce the same result:
wchar_t me[] = L"George Jackson\n";
wprintf(me);
wprintf(&me[0]);
wprintf(&me);
"We make a living by what we get, we make a life by what we give." --Winston Churchill
|
|
|
|
|
I know there are differences (I already suggested you to check out all of the current thread posts).
The statements I shown produce the same results while the compiler error in yours has nothing to do with the wide char version of printf , for instance
wchar_t you[] = L"George Jackson\n";
wprintf(L"%s\n", you);
wprintf(L"%s\n", &you[0]);
wprintf(L"%s\n", &you);
compiles fine.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
|
|
|
|
|
You are using a format string; I am not. The following definitely doesn't have the same result:
#include <iostream>
#include <string>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
wchar_t me[] = L"George Jackson\n";
wcout << me << endl;
wcout << &me[0] << endl;
wcout << &me << endl;
wchar_t *me_ptr = me;
wcout << me_ptr << endl;
me_ptr = &me[0];
wcout << me_ptr << endl;
wchar_t (*me2_ptr)[16] = &me;
wcout << *me2_ptr << endl;
return 0;
}
"We make a living by what we get, we make a life by what we give." --Winston Churchill
|
|
|
|
|
Well, you can find a lot of samples showing that there are differences, because indeed there are differences (I never stated the opposite). However there are some examples wherein array and &array have the same role, I have simply shown one of them.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
|
|
|
|
|
Yes, you have shown one example that can take several overloads. array and &array[0] are the standard ways of getting pointer and the address of an array. However, &array should not be used in the way you have demonstrated. Using &array with other types is interpreted as T (*)[ARRARY_SIZE] , explicitly, or T** , implicitly. The "&" of &array is not ignored by all compilers. If it is ignored, it is probably implicitly being casted (reinterpret_cast ) to a char* or wchar_t* ; thus, creating inefficient code.
"We make a living by what we get, we make a life by what we give." --Winston Churchill
|
|
|
|
|
Thanks for your great reply, George!
Why T (*)[ARRARY_SIZE] is the same as T** implicitly?
regards,
George
|
|
|
|