
关于指针与数组的关系
设有下列定义和语句charstr[20]="Program",*p;p=str;下列叙述正确的是A*p与str[0]的值相等Bstr与p的类型完全相同Cstr数组长度和p...
设有下列定义和语句
char str[20]="Program",*p;
p=str;
下列叙述正确的是
A *p与str[0]的值相等
B str与p的类型完全相同
C str 数组长度和p所指向的字符串长度相等
D 数组str中存放的内容和指针变量p中存放的内容相等
答案是A
*p不是整个数组的值吗
B为什么不对 都应该是指针类型啊 还有c d 为什么不对 展开
char str[20]="Program",*p;
p=str;
下列叙述正确的是
A *p与str[0]的值相等
B str与p的类型完全相同
C str 数组长度和p所指向的字符串长度相等
D 数组str中存放的内容和指针变量p中存放的内容相等
答案是A
*p不是整个数组的值吗
B为什么不对 都应该是指针类型啊 还有c d 为什么不对 展开
6个回答
展开全部
定义:
在C语言和C++语言中,数组元素全为指针的数组称为指针数组。
一维指针数组的定义形式为:“类型名 *数组标识符[数组长度]”。
例如,一个一维指针数组的定义:int *ptr_array[10]。
含义:
指针数组中的每一个元素均为指针,即有诸形如“*ptr_array”的指针。
指针数组中的元素亦可以表示为“*(*(ptr_array+i))”。又因为“()”的优先级较“*”高,且“*”是右结合的,因此可以写作**(ptr_array+i)。
由于数组元素均为指针,因此ptr_array是指第i+1个元素的指针。
运用:
指针数组可以作为函数的参量使用,使用方式与普通数组类似。
指针数组常适用于指向若干字符串,这样使字符串处理更加灵活方便。
对比:
与数组指针关系折叠
数组指针是指向数组首元素的地址的指针,其本质为指针(这个指针存放的是数组首地址的地址,相当于2级指针,这个指针不可移动); 指针数组是数组元素为指针的数组,其本质为数组。
例如:*p[2]是指针数组,实质是一个数组,里面的两个元素都是指针 []的优先级比*的优先级高,p先与[]结合,形成数组p[2],有两个元素的数组,再与*结合,表示此数组是指针类型的,每个数组元素相当于一个指针变量
与二维数组对比:
二维数组:如char string_1[10][10]只要定义了一个二维数组,无论赋不赋值,系统都会给他分配相应空间,而且该空间一定是连续的。其每个元素表示一个字符。我们可以通过制定下标对其元素进行修改。
指针数组:如char *str_B[5] 系统至少会分配5个连续的空间用来存储5个元素,表示str_B是一个5个元素的数组,每个元素是一个指向字符型数据的一个指针。
如果我做这样的定义:
char a[3][8]={"gain","much","strong"};
char *n[3]={"gain","much","strong"};
他们在内存的存储方式分别如右图所示,可见,系统给数组a分配了
3×8的空间,而给n分配的空间则取决于具体字符串的长度。
此外,系统分配给a的空间是连续的,而给n分配的空间则不一定连续。
由此可见,相比于比二维字符数组,指针数组有明显的优点:一是指针数组中每个元素所指的字符串不必限制在相同的字符长度;二是访问指针数组中的一个元素是用指针间接进行的,效率比下标方式要高。 但是二维字符数组却可以通过下标很方便的修改某一元素的值,而指针数组却无法这么做。
举例:
数组指针:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<stdio.h>
charc[][2] = {"哥", "哥", "我", "岸", "上", "走"}; //因为一个汉字占用两个字节
char(*p)[2];
inti;
voidmain()
{
p=c; //将指针定位于c[0]
for(i=0;i<=5;i++)
{
printf("%s, ", *(p+i)); //或者将*(p+i)替换成*p++
}
printf("\n");
for(i=5;i>=0;i--)
{
printf("%s,",*(p+i)); //或者将*(p+i)替换成*p--
}
}
展开
指针数组:
int i;
char *pch[6] = {"妹","妹","你","坐","船","头"};
for(i=0;i<6;i++)
{
printf("%s, ",*(pch+i));
}
printf("\n");
for(i=5; i>=0; i--)
{
printf("%s\n",*(pch+i));
}
在C语言和C++语言中,数组元素全为指针的数组称为指针数组。
一维指针数组的定义形式为:“类型名 *数组标识符[数组长度]”。
例如,一个一维指针数组的定义:int *ptr_array[10]。
含义:
指针数组中的每一个元素均为指针,即有诸形如“*ptr_array”的指针。
指针数组中的元素亦可以表示为“*(*(ptr_array+i))”。又因为“()”的优先级较“*”高,且“*”是右结合的,因此可以写作**(ptr_array+i)。
由于数组元素均为指针,因此ptr_array是指第i+1个元素的指针。
运用:
指针数组可以作为函数的参量使用,使用方式与普通数组类似。
指针数组常适用于指向若干字符串,这样使字符串处理更加灵活方便。
对比:
与数组指针关系折叠
数组指针是指向数组首元素的地址的指针,其本质为指针(这个指针存放的是数组首地址的地址,相当于2级指针,这个指针不可移动); 指针数组是数组元素为指针的数组,其本质为数组。
例如:*p[2]是指针数组,实质是一个数组,里面的两个元素都是指针 []的优先级比*的优先级高,p先与[]结合,形成数组p[2],有两个元素的数组,再与*结合,表示此数组是指针类型的,每个数组元素相当于一个指针变量
与二维数组对比:
二维数组:如char string_1[10][10]只要定义了一个二维数组,无论赋不赋值,系统都会给他分配相应空间,而且该空间一定是连续的。其每个元素表示一个字符。我们可以通过制定下标对其元素进行修改。
指针数组:如char *str_B[5] 系统至少会分配5个连续的空间用来存储5个元素,表示str_B是一个5个元素的数组,每个元素是一个指向字符型数据的一个指针。
如果我做这样的定义:
char a[3][8]={"gain","much","strong"};
char *n[3]={"gain","much","strong"};
他们在内存的存储方式分别如右图所示,可见,系统给数组a分配了
3×8的空间,而给n分配的空间则取决于具体字符串的长度。
此外,系统分配给a的空间是连续的,而给n分配的空间则不一定连续。
由此可见,相比于比二维字符数组,指针数组有明显的优点:一是指针数组中每个元素所指的字符串不必限制在相同的字符长度;二是访问指针数组中的一个元素是用指针间接进行的,效率比下标方式要高。 但是二维字符数组却可以通过下标很方便的修改某一元素的值,而指针数组却无法这么做。
举例:
数组指针:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<stdio.h>
charc[][2] = {"哥", "哥", "我", "岸", "上", "走"}; //因为一个汉字占用两个字节
char(*p)[2];
inti;
voidmain()
{
p=c; //将指针定位于c[0]
for(i=0;i<=5;i++)
{
printf("%s, ", *(p+i)); //或者将*(p+i)替换成*p++
}
printf("\n");
for(i=5;i>=0;i--)
{
printf("%s,",*(p+i)); //或者将*(p+i)替换成*p--
}
}
展开
指针数组:
int i;
char *pch[6] = {"妹","妹","你","坐","船","头"};
for(i=0;i<6;i++)
{
printf("%s, ",*(pch+i));
}
printf("\n");
for(i=5; i>=0; i--)
{
printf("%s\n",*(pch+i));
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |