想问一下关于C++语言中字符串首地址的问题

一个指针变量有4个字节,可以存放字符串的首地址,如char *p,p=“Monday”,那么在内存中存放的首地址是字符M的地址么?换句话说,如果struct{int x,char *y;}tab[2]={{1,"ab"},{2,"cd"}}, *p=tab;表达式*p->y的结果为什么。我认为是ab,因为这里用指向结构体变量的指针调用了成员“指针y”,它存放了字符串“ab”的首地址,但是答案给的是‘a’。是因为指针存放的字符串第一个字母的地址么?
自有点多,麻烦了

1、char *p;
p = "Monday";
M的地址就是首地址
2、不太清楚你要问的问题,按照你给的题目大概想要表达的问题,个人理解是指针p是数组tab的首地址;指针p->y就是结构体成员变量y的首地址。
//结构体
struct table{
int x;

char *y;

};
//结构体数组
struct table tab[2]={{1,"ab"},{2,"cd"}};
struct table *p;
p = tab;
//输出数组第0个元素中的y字符串
printf("%s\n",p->y);
结果:ab
温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-12-18
#include <iostream>
using namespace std;

typedef struct
{
    int x;
    char *y;
} Tab;

int main()
{
    const char *p = "Monday"; //这里"Monday"是个常量字符串,p指向了这个字符串的首地址
    cout << p << endl;

    Tab tab[] =
    {
        {1, "ab"},
        {2, "cd"}
    };

    Tab *pp = tab;
    cout << *pp->y << endl;  //这里被解析成 cout << *(pp->y), 输出是一个字符
    cout << (*pp).y << endl; //这没疑问,输出的就是ab
    cout << pp->y << endl;   //输出"ab",这是你原来想要的方式
    cout << *(pp->y)<< endl; //没疑问,a
}

补充:这实际上是个运算符号的优先级的问题,
->的优先级高于*的优先级,所以*pp->y的运算是*(pp->y),只取了一个字符,而不是你想要的(*pp).y

第2个回答  2017-12-18
正确,是M的地址
字符串指针存放的就是字符串首字符地址,指针只能指向一个点追问

那麻烦再问一个问题,首地址是几个字节的?int型数组,double型数组和字符串的首地址长度一样么?

本回答被提问者采纳
相似回答