C语言 指针的指针
代码如下,*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));
}
} %s格式输出字符串时,就是要提供字符串首地址的,从这个首地址开始输出直到遇到 \0 结束。这里 *(p+i)是第 i 个字符串的地址,没有问题。
输出第 i 个字符串的第 j 个字符可以用:( i, j 都从0开始 )
printf("%c\n",*(*(p + i) + j));
或
printf("%c\n",(*(p + i))); char *strings[]定义两个指针数组,即*strings和*string,它们分别指向两个字符数组,p=strings即将string的地址头地址赋值给p,这里是将字符串的头地址赋给p,而p+i不再是简单的加法而是“地址+i”,所以按照地址加i的原则,这里取到string的地址加i,意味着取到下一个字符串的首地址,所以可以取下一个字符串。
要取某个字符,可以这么想,我们知道字符串的首地址,就可以继续string+i 取字符,“string+i”运算也可等价于"string"运算,注意输出的格式就行了。
#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);
printf("%c\n",strings);
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= "<<*p<<endl;
cout<<"*strings= "<<*strings<<endl;
cout<<"*p= "<<*p<<endl;
cout<<"strings= "<<strings<<endl;
cout<<"strings= "<<strings<<endl;
cout<<"/*******************************/"<<endl;
for(int i=0; i<2; i++)
{
cout<<"*(p+"<<i<<")="<<*(p+i)<<endl;
}
return 0;
}
页:
[1]