鱼C论坛

 找回密码
 立即注册
查看: 1636|回复: 2

[已解决]C语言 指针的指针

[复制链接]
发表于 2019-10-11 21:28:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

代码如下,*strings[]是指针数组,**p是指针的指针,那么p应该指的是*strings[]指针数组中存储的指针变量的地址,
*p指的是字符串的地址,**p指的是字符串的值,可是这里输出字符串的时候,为什么是用*(p+i)?
还有就是如果要输出某个字符的值应该如何表示呢?


#include<stdio.h>
main()
{
        char *strings[]={"C language",
                "Basic"}
        char **p,i;
        p=strings;
        for (i=0;i<2;i++)
        {
                print("%s\n,*(p+i));
        }
}
最佳答案
2019-10-12 19:41:41
%s格式输出字符串时,就是要提供字符串首地址的,从这个首地址开始输出直到遇到 \0 结束。这里 *(p+i)是第 i 个字符串的地址,没有问题。
输出第 i 个字符串的第 j 个字符可以用:( i, j 都从0开始 )
printf("%c\n",  *(*(p + i) + j));

printf("%c\n",  (*(p + i))[j]);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-12 19:41:41 | 显示全部楼层    本楼为最佳答案   
%s格式输出字符串时,就是要提供字符串首地址的,从这个首地址开始输出直到遇到 \0 结束。这里 *(p+i)是第 i 个字符串的地址,没有问题。
输出第 i 个字符串的第 j 个字符可以用:( i, j 都从0开始 )
printf("%c\n",  *(*(p + i) + j));

printf("%c\n",  (*(p + i))[j]);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-12 20:08:15 | 显示全部楼层
char *strings[]定义两个指针数组,即*strings[0]和*string[1],它们分别指向两个字符数组,p=strings即将string的地址头地址赋值给p,这里是将字符串的头地址赋给p,而p+i不再是简单的加法而是“地址+i”,所以按照地址加i的原则,这里取到string的地址加i,意味着取到下一个字符串的首地址,所以可以取下一个字符串。
要取某个字符,可以这么想,我们知道字符串的首地址,就可以继续string[0]+i 取字符,“string[0]+i”运算也可等价于"string[0][i]"运算,注意输出的格式就行了。
#include<stdio.h>
#include <iostream>
using namespace std;

int main()
{
    char *strings[]= {"C language", "Basic" };
    char **p,i;
    p=strings;
    for (i=0; i<2; i++)
    {
        printf("%s\n",*(p+i));
    }
    printf("%c\n",*strings[0]);
    printf("%c\n",strings[0][0]);
    printf("%c\n",**p);
    cout<<p<<endl;
    cout<<p+1<<endl;
    cout<<strings<<endl;
    cout<<strings+1<<endl;
    cout<<"*p= "<<*p<<endl;
    cout<<"*p+1= "<<*p+1<<endl;//移了一个地址
    cout<<"*(p+1)="<<*(p+1)<<endl;
    cout<<"*strings= "<<*strings<<endl;
    cout<<"*strings+1= "<<*strings+1<<endl; //移了一个地址
    cout<<"*(strings+1)= "<<*(strings+1)<<endl;
    cout<<"*p[0]= "<<*p[0]<<endl;
    cout<<"*strings[0]= "<<*strings[0]<<endl;
    cout<<"*p[0]= "<<*p[0]<<endl;
    cout<<"strings[0][4]= "<<strings[0][4]<<endl;
    cout<<"strings[1][2]= "<<strings[1][2]<<endl;
    cout<<"/*******************************/"<<endl;
    for(int i=0; i<2; i++)
    {
        cout<<"*(p+"<<i<<")="<<*(p+i)<<endl;
    }
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-19 01:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表