473,230 Members | 1,720 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,230 software developers and data experts.

one simple question

Hi there,

I have been trying to understand the behaviour of char (*pfn)(null)
for a couple of days. can some body help me understand the behaviour
of char (*pfn)(null) in Visual C++ environment?

The question is why this is legal
char *ptr;
char (*pfn)(null);
ptr = pfn

and this is not
char *ptr;
char (*fpn)();
ptr = *pfn // compile time error.

what actually is happening in the first case is that compiler treating
char (*pfn)(NULL) as char pointer. the question is why its not
generating the error for the first case too as both are two totally
different ideas.

Any response is highly appreciated.

Regards,
Asif
Jul 19 '05 #1
4 2757
Asif wrote:
Hi there,

I have been trying to understand the behaviour of char (*pfn)(null)
for a couple of days. can some body help me understand the behaviour
of char (*pfn)(null) in Visual C++ environment?

The question is why this is legal
char *ptr;
char (*pfn)(null);
ptr = pfn

and this is not
char *ptr;
char (*fpn)();
ptr = *pfn // compile time error.

what actually is happening in the first case is that compiler treating
char (*pfn)(NULL) as char pointer. the question is why its not
generating the error for the first case too as both are two totally
different ideas.

Any response is highly appreciated.

Regards,
Asif


The declaration:
char (*pfn)(null);
is of a pointer to a function taking a "null" type and
returning a type of char. To my understanding, there is no
type of "null" in _standard_ C++.

Try this:
char (*pfn)(void);

A pointer to a function is different than a pointer to a variable.
One cannot assign the value from a "pointer to function" to a
"pointer to variable".

What you probably want is to assign the _result_ from the function
to the variable pointed to by a pointer:
char some_function(void)
{
return 'A';
}

char my_char;
char * ptr_my_char; // pointer to a char variable.
char (*pfn)(void); // pointer to a function.

ptr_my_char = &my_char; // initialize the variable pointer
pfn = some_function; // initialize the function pointer

*ptr_my_char = 'B'; // assign a char to 'my_char'
// via pointer. my_char == 'B'.

*ptr_my_char = (*pfn)(); // Execute some_function() via
// the pointer 'pfn' and put the
// result into 'my_char' via the
// pointer 'ptr_my_char'.

Remember that pointers to functions cannot be assigned to
pointers to variables.

--
Thomas Matthews

C++ newsgroup welcome message:
http://www.slack.net/~shiva/welcome.txt
C++ Faq: http://www.parashift.com/c++-faq-lite
C Faq: http://www.eskimo.com/~scs/c-faq/top.html
alt.comp.lang.learn.c-c++ faq:
http://www.raos.demon.uk/acllc-c++/faq.html
Other sites:
http://www.josuttis.com -- C++ STL Library book

Jul 19 '05 #2
Well john, thanks for the reply.
Its cleared now.

Asif
"John Harrison" <jo*************@hotmail.com> wrote in message news:<bi************@ID-196037.news.uni-berlin.de>...
"Asif" <as******@hotmail.com> wrote in message
news:3e**************************@posting.google.c om...
Hi there,

I have been trying to understand the behaviour of char (*pfn)(null)
for a couple of days. can some body help me understand the behaviour
of char (*pfn)(null) in Visual C++ environment?

The question is why this is legal
char *ptr;
char (*pfn)(null);


You mean NULL;
ptr = pfn

and this is not
char *ptr;
char (*fpn)();
ptr = *pfn // compile time error.

what actually is happening in the first case is that compiler treating
char (*pfn)(NULL) as char pointer. the question is why its not
generating the error for the first case too as both are two totally
different ideas.

Any response is highly appreciated.

Regards,
Asif


char (*pfn)(NULL);

is equivalent to

char (*pfn)(0);

is equivalent to

char *pfn(0);

is equivalent to

char *pfn = 0;

It's easy to forget that you can have redundant parens in variable
declarations. Try this

char ((((*pfn))))(NULL);

john

Jul 19 '05 #3
> The declaration:
char (*pfn)(null);
is of a pointer to a function taking a "null" type and
returning a type of char. To my understanding, there is no
type of "null" in _standard_ C++.
You have the same kind of concept that i had :) Look what john said in
the same thread.

null = NULL; // sorry typo mistake.

char (*pfn)(NULL);
is not a pointer to a function taking a "null" type and
returning a type of char. Rather its just equivalent to char *pfn =
NULL;

I came to this discussion because i been reviewing one of my colleague
code and have found this discrepancy, He actually loved initializing
normal pointers with NULL the way i mentioned above and It looked
confusing at that time. But now its cleared.
Asif
Thomas Matthews <Th**********************@sbcglobal.net> wrote in message news:<ZA**********************@newssvr28.news.prod igy.com>... Asif wrote:
Hi there,

I have been trying to understand the behaviour of char (*pfn)(null)
for a couple of days. can some body help me understand the behaviour
of char (*pfn)(null) in Visual C++ environment?

The question is why this is legal
char *ptr;
char (*pfn)(null);
ptr = pfn

and this is not
char *ptr;
char (*fpn)();
ptr = *pfn // compile time error.

what actually is happening in the first case is that compiler treating
char (*pfn)(NULL) as char pointer. the question is why its not
generating the error for the first case too as both are two totally
different ideas.

Any response is highly appreciated.

Regards,
Asif
The declaration:
char (*pfn)(null);
is of a pointer to a function taking a "null" type and
returning a type of char. To my understanding, there is no
type of "null" in _standard_ C++.


Try this:
char (*pfn)(void);

A pointer to a function is different than a pointer to a variable.
One cannot assign the value from a "pointer to function" to a
"pointer to variable".

What you probably want is to assign the _result_ from the function
to the variable pointed to by a pointer:
char some_function(void)
{
return 'A';
}

char my_char;
char * ptr_my_char; // pointer to a char variable.
char (*pfn)(void); // pointer to a function.

ptr_my_char = &my_char; // initialize the variable pointer
pfn = some_function; // initialize the function pointer

*ptr_my_char = 'B'; // assign a char to 'my_char'
// via pointer. my_char == 'B'.

*ptr_my_char = (*pfn)(); // Execute some_function() via
// the pointer 'pfn' and put the
// result into 'my_char' via the
// pointer 'ptr_my_char'.

Remember that pointers to functions cannot be assigned to
pointers to variables.

--
Thomas Matthews

C++ newsgroup welcome message:
http://www.slack.net/~shiva/welcome.txt
C++ Faq: http://www.parashift.com/c++-faq-lite
C Faq: http://www.eskimo.com/~scs/c-faq/top.html
alt.comp.lang.learn.c-c++ faq:
http://www.raos.demon.uk/acllc-c++/faq.html
Other sites:
http://www.josuttis.com -- C++ STL Library book

Jul 19 '05 #4
Faz
"Thomas Matthews" <Th**********************@sbcglobal.net> wrote in message
news:ZA**********************@newssvr28.news.prodi gy.com...
Asif wrote: []
I have been trying to understand the behaviour of char (*pfn)(null)
for a couple of days. can some body help me understand the behaviour
of char (*pfn)(null) in Visual C++ environment?

[]

You'll most likely find a macro called NULL in one of the Visual C++
headers.
The declaration:
char (*pfn)(null);
is of a pointer to a function taking a "null" type and
returning a type of char. To my understanding, there is no
type of "null" in _standard_ C++.
Yes, there is no such type..
No, this doesn't declare a function.

It *would* if "null" were replaced by, say, "float" (which IS a type), or by
"double x" (a type and a name).
Empty brackets would be equivalent to replacing the "null" with "void", ie
also making this a function declaration (like your example later).

The NULL macro often supplied with some compilers means the brackets would
contain a value, hence this would declare a simple char* whose value is 0,
if the OP had uppercased it.
(As it stands its a syntax error :-)

BTW Stroustrup (5.1.1) discourages use of a NULL macro and recommends
instead to use the literal 0 to indicate that the pointer doesn't refer to
an object (leads to fewer problems).

[] One cannot assign the value from a "pointer to function" to a
"pointer to variable".


Not without coercion via an evil cast, true.

("Trust the programmer"..)

-Faz


Jul 19 '05 #5

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

3
by: Patchwork | last post by:
Hi Everyone, Please take a look at the following (simple and fun) program: //////////////////////////////////////////////////////////////////////////// ///////////// // Monster Munch, example...
1
by: Proteus | last post by:
Any help appreciated on a small perl project I need to write for educator/teaching purposes. I have not programmed perl for some time, need to get up to speed, maybe some kind souls hrere will help...
2
by: Raskolnikow | last post by:
Hi! I have a very simple problem with itoa() or the localtime(...). Sorry, if it is too simple, I don't have a proper example. Please have a look at the comments. struct tm *systime; time_t...
3
by: Peter | last post by:
Hello Thanks for reviewing my question. I would like to know how can I programmatically select a node Thanks in Advanc Peter
7
by: abcd | last post by:
I am trying to set up client machine and investigatging which .net components are missing to run aspx page. I have a simple aspx page which just has "hello world" printed.... When I request...
4
by: dba_222 | last post by:
Dear Experts, Ok, I hate to ask such a seemingly dumb question, but I've already spent far too much time on this. More that I would care to admit. In Sql server, how do I simply change a...
14
by: Giancarlo Berenz | last post by:
Hi: Recently i write this code: class Simple { private: int value; public: int GiveMeARandom(void);
30
by: galiorenye | last post by:
Hi, Given this code: A** ppA = new A*; A *pA = NULL; for(int i = 0; i < 10; ++i) { pA = ppA; //do something with pA
10
by: Phillip Taylor | last post by:
Hi guys, I'm looking to develop a simple web service in VB.NET but I'm having some trivial issues. In Visual Studio I create a web services project and change the asmx.vb file to this: Imports...
17
by: Chris M. Thomasson | last post by:
I use the following technique in all of my C++ projects; here is the example code with error checking omitted for brevity: _________________________________________________________________ /*...
0
by: VivesProcSPL | last post by:
Obviously, one of the original purposes of SQL is to make data query processing easy. The language uses many English-like terms and syntax in an effort to make it easy to learn, particularly for...
0
by: jianzs | last post by:
Introduction Cloud-native applications are conventionally identified as those designed and nurtured on cloud infrastructure. Such applications, rooted in cloud technologies, skillfully benefit from...
2
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 7 Feb 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:30 (7.30PM). In this month's session, the creator of the excellent VBE...
0
by: fareedcanada | last post by:
Hello I am trying to split number on their count. suppose i have 121314151617 (12cnt) then number should be split like 12,13,14,15,16,17 and if 11314151617 (11cnt) then should be split like...
0
by: stefan129 | last post by:
Hey forum members, I'm exploring options for SSL certificates for multiple domains. Has anyone had experience with multi-domain SSL certificates? Any recommendations on reliable providers or specific...
0
Git
by: egorbl4 | last post by:
Скачал я git, хотел начать настройку, а там вылезло вот это Что это? Что мне с этим делать? ...
1
by: davi5007 | last post by:
Hi, Basically, I am trying to automate a field named TraceabilityNo into a web page from an access form. I've got the serial held in the variable strSearchString. How can I get this into the...
0
by: MeoLessi9 | last post by:
I have VirtualBox installed on Windows 11 and now I would like to install Kali on a virtual machine. However, on the official website, I see two options: "Installer images" and "Virtual machines"....
0
by: DolphinDB | last post by:
Tired of spending countless mintues downsampling your data? Look no further! In this article, you’ll learn how to efficiently downsample 6.48 billion high-frequency records to 61 million...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.