*& question

Hi! Experts,

When I work on ObjectArx which is a library by AutoDesk to program with AutoCad, I met a defination like this:

Acad::ErrorStatus getName(const char*& pName) const;

I don't understand what char*& mean. I did the following:

char name[20];
char* rname = name;
pBlockTableRecord->getName(rname);
acutPrintf("\nThe block name is : %s", rname);

acutPrintf is similar to printf. It works.

But if I write

acutPrintf("\nThe block name is : %s", name);

It gives me junk chars.

If I write

char name[20];
pBlockTableRecord->getName(name);

The compiler gives me an error saying it can not convert char[20] to char*&.

What is the mystic *& mean?

Thanks for your help.

Jzzhang
LVL 2
jzzhangAsked:
Who is Participating?

[Product update] Infrastructure Analysis Tool is now available with Business Accounts.Learn More

x
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

jkrCommented:
>>I don't understand what char*& mean

This means that the function takes a reference to a pointer. Technically speaking, the result is similar to using a 'char**'

>>if I write
>>acutPrintf("\nThe block name is : %s", name);
>>It gives me junk chars.

Yes, because 'pname' no longer points to 'name'.

Use

strcpy ( name, pname);

before, and it will work.


jkrCommented:
BTW, the behaviour would be the same if you used

void ChangeThePointer ( char*& p) {

   p = "ChangeThePointer";
}


char* p = "test";

printf ( "before: %s\n", p);

ChangeThePointer ( p);

printf ( "after: %s\n", p);
fsign21Commented:
PMI ACP® Project Management

Prepare for the PMI Agile Certified Practitioner (PMI-ACP)® exam, which formally recognizes your knowledge of agile principles and your skill with agile techniques.

Sys_ProgCommented:
Here's the explanation

In C, when u need to modify the contents of a variable, u pass the address of the variable and recieve it in a pointer variable of the same type. Using the pointer u can change the contents of your variable.

But if u need to change the contents of the pointer itself, i.e. make the pointer point to something else using a function, then u need to pass the address of the pointer variable, For this case the function would be taking a pointer to a pointer argument
Example
void f ( int ** p ) ;
Inside f(), u would have use the cumbersome syntax for referring to the double pointer


Now C++ makes this easy by letting u pass a pointer by reference and that is what u asked for
getName(const char*& pName)

means pName is a reference to a pointer to a char const


Regarding ---------The compiler gives me an error saying it can not convert char[20] to char*&.====

Any statically declared array [e.g. char a[20]] is by definition a const pointer. Now Your function is trying to pass a reference to the pointer, thus it runs the risk of changing it i.e. making it point to something else, but this is not allowed for a const pointer OR an array.

That's the reason for the error

HTH

Amit

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
jkrCommented:
>>Here's the explanation

Haven't I already posted that?
jzzhangAuthor Commented:
Amit:

It looks like
getName(const char*& pName)
means pName is a reference to a pointer to a char const

I will test it.

Be back soon.

Jzzhang
jzzhangAuthor Commented:
Amit,

I tested it. It works. So char*& should be interpreted as a reference to a char pointer.

Here is the small test code:

bool AllocStr(char*& szStr)
{
      szStr = new char[15];
      lstrcpy(szStr, "This is a test");
      return 1;
}

int main()
{
      char* psz;

      AllocStr(psz);
      wsprintf(g_szMsg, "Allocated string (%s) length is %d", psz, lstrlen(psz));
      InfoMsgBox(g_szMsg);
      delete psz;
}

Then, how to accept your answer?

Jzzhang
Sys_ProgCommented:
I guess when u open this question, against each of the answers, u get a button for accepting a particular answer.

U can also give grades to the answer.

read the help for Accepting a Answer
Sys_ProgCommented:
Here's the link for the help

http://www.experts-exchange.com/help.jsp#hi68
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
C++

From novice to tech pro — start learning today.