char pointers: invalid conversion from ‘char*’ to ‘char’?

Dealing with char, char*, and char [] in C is a little confusing in the beginning.

Take a look at the following statements:

char str1[] = "abcd";
char const* str2 = "xyz";
char* cp = str1;
char c = *cp;

The first statement and the second statement are identical in their behavior. After the first statement is executed, str1 points to a location that contains 4 characters, in consecutive order. If you think of the memory locations for the string, you might see something like:

+---+---+---+---+
| a | b | c | d |
+---+---+---+---+

str1 points to the address where a is stored. There is a similar arrangement for storing the string "xyz" and str2 points to the address where x is stored.

In the third statement, you are creating cp and making it point where str1 is pointing. After that statement, both cp and str1 point to the same string – "abcd".

*cp evaluates to the character that exists at the address that cp points to. In this case, it will be 'a'.

In the fourth statement, you are initializing c with 'a', the character that exists at the address pointed to by cp.

Now, if you try a statement

*cp = str2;

it is a compiler error. *cp simply dereferences the address of cp. You can put a char at that location, not str2, which is a char*.

You can execute

*cp = *str2;

After that, the objects in the memory that str1 and cp point to will look like:

+---+---+---+---+
| x | b | c | d |
+---+---+---+---+

If you want to copy the string from the address pointed to by str1 to the address pointed to by cp, you can use the standard library function strcpy.

strcpy(cp, str2);

You have to be careful about using strcpy because you have to have enough valid memory to copy to. In this particular example, if you tried

char str3[2];
strcpy(str3, cp);

you will get undefined behavior since there isn’t enough memory in str3 to be able to copy "abcd".

Hope that made sense.

Here’s a modified version of your code that should work:

#include <stdio.h>
#include <ctype.h>
#include <string.h>

void getname(char *whatname, char *whatlastname);

int main()
{
    int option = 0;
    char guyname[32];
    char lastname[32];
    bool name_entered = false;

    do{
        printf("1. Enter name.\n");
        printf("2. Enter exam scores.\n");
        printf("3. Display average exam scores. \n");
        printf("4. Display summary. \n");
        printf("5. Quit. \n");
        scanf("%i", &option);

        if( option == 1 )
        {
            name_entered = true;
            getname(guyname, lastname);
        }
        else if( option == 5 )
        {
            printf(" Come back with a better grade next time.");
            break;
        }
    }while (!(option >5 || option <1));
    return 0;
}

Leave a Comment