|
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
|
|
|
|
|
In order to pass myself_ptr to the function print_myself . I have to dereference it to a pointer. Thus, myself_ptr acts like a pointer-to-a-pointer but it is really a pointer to an array pointer.
void print_myself(wchar_t* myself)
{
wcout << myself << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
wchar_t myself[] = L"George Jackson";
wchar_t (*myself_ptr)[15] = &myself;
print_myself(*myself_ptr);
return 0;
}
However, if you use just **myself_ptr as in wcout << **myself_ptr << endl; , the output would be just 'G' since **myself_ptr is dereferencing to the address of the first character and not the string, "George Jackson".
"We make a living by what we get, we make a life by what we give." --Winston Churchill
modified on Monday, December 10, 2007 10:56:33 PM
|
|
|
|
|
I'm a bit tired about your rather dogmatic approach (don't blame me about ).
First of all, you cannot pretend we're using C++ . The construct works as well using C language and its C++ behavior it is probably due to C inheritance.
On this grounds you can well understand that reinterpret_cast it is out-of-the-game.
Now let's make a little test.
The following C program:
int main(int argc, _TCHAR* argv[])
{
char a[]="hello world";
char * p = a;
char * q = &a[0];
char * r = &a;
printf("%x %x %x\n", p, q, r);
getchar();
}
compiles fine.
On execution the values of the p,q,r are the same (i.e. the address of the memory containing the string "hello world" ) and, if you look at assembly generated, you can find:
char * p = a;
00413392 lea eax,[ebp-14h]
00413395 mov dword ptr [ebp-20h],eax
char * q = &a[0];
00413398 lea eax,[ebp-14h]
0041339B mov dword ptr [ebp-2Ch],eax
char * r = &a;
0041339E lea eax,[ebp-14h]
004133A1 mov dword ptr [ebp-38h],eax
So your supposed inefficiency is out-of-the-game too.
Of course C++ compiler tends to be 'more strict' on type checking, but this has nothing to do with the core of the original note, that I can summarize as follows:
On a real pointer variable (e.g. char *p ) the address-of-operator & as the noticeable effect of really taking the address of the variable (address of p ). On the other hand, when & is applied to an array name (e.g. to the name a of the array char a[5]; ) it returns the same address that the array name itself returns.
In other words,
char a[5];
char *p;
p = a;
printf("p=%x, &p=%x\n);
printf("a=%x, &a=%x\n");
produces (on my computer, maybe you'll find something quite similar on yours) the following output:
p=12ff58 &p=12ff4c
a=12ff58 &a=12ff58
As I stated above, this is the main point. That said, there are differences between a and &a , differences extensively pointed out in this thread postings and related documentation.
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.
|
|
|
|
|
Was I being dogmatic?
My point is that &array seems to work okay with formatted output but may not work in other situations. &array in C++ is a different type than arrar and &array[0] , and behaves differently. Yes, they all return the same address; but, remember, C is no longer a true subset of C++ since there are now too many gotchas.
#include <iostream>
#include <string>
using namespace std;
void print_myself(wchar_t* myself)
{
wcout << myself << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
wchar_t myself[] = L"George Jackson";
print_myself(myself);
print_myself(&myself[0]);
print_myself(&myself);
return 0;
} Thus, it should not even be an alternative to array and &array[0] .
Thanks for the discussion.
"We make a living by what we get, we make a life by what we give." --Winston Churchill
|
|
|
|
|
George L. Jackson wrote: Was I being dogmatic?
My point is that &array seems to work okay with formatted output but may not work in other situations. &array in C++ is a different type than arrar and &array[0], and behaves differently. Yes, they all return the same address; but, remember, C is no longer a true subset of C++ since there are now too many gotchas.
#include <iostream>
#include <string>
using namespace std;
void print_myself(wchar_t* myself)
{
wcout << myself << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
wchar_t myself[] = L"George Jackson";
print_myself(myself);
print_myself(&myself[0]);
// wchar_t (*myself_ptr)[15] = &myself;
print_myself(&myself); // Won't compile in C++ as is.
return 0;
}
Thus, it should not even be an alternative to array and &array[0].
I give up.
George L. Jackson wrote: Thanks for the discussion.
You're welcome, I was just kidding.
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: ...this has nothing to do with the core of the original note...
None of what you and George are discussing has anything to do with the OP's syntax problem.
"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
|
|
|
|
|
Sorry, we got caught up in expressing our point and the discussion whent amok!
"We make a living by what we get, we make a life by what we give." --Winston Churchill
|
|
|
|
|
No need to apologize, George. I was anything but offended.
"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
|
|
|
|
|
|