c语言数组一维数组指针数组指针数组指针
⑴ c语言中,如何定义一个‘指针数组’,这个‘指针数组’专门用来存放‘数组指针’。
指针数组定义int*p[n];
[]优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1时,则p指向下一个数组元素,
这样赋值是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样*p=a;这里*p表示指针数组第一个元素的值,a的首地址的值。
数组指针定义int(*p)[n];
()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。
如要将二维数组赋给一指针,应这样赋值:
int a[3][4];
int(*p)[4];//该语句是定义一个数组指针,指向含4个元素的一维数组。
p=a;//将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]
p++;//该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]
(1)c语言数组一维数组指针数组指针数组指针扩展阅读:
与数组指针关系
数组指针是指向数组首元素的地址的指针,其本质为指针(这个指针存放的是数组首地址的地址,相当于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分配的空间则不一定连续。
由此可见,相比于比二维字符数组,指针数组有明显的优点:一是指针数组中每个元素所指的字符串不必限制在相同的字符长度;二是访问指针数组中的一个元素是用指针间接进行的,效率比下标方式要高。但是二维字符数组却可以通过下标很方便的修改某一元素的值,而指针数组却无法这么做。
举例编辑
数组指针:
#include<stdio.h>
int main()
{
char c[][4]={"哥","哥","我","岸","上","走"};//UTF-8:一个汉字=3个字节
char(*p)[4];
int i;p=c;//将指针定位于c[0]
for(i=0;i<=5;i++)
{
printf("%s,",*(p+i));//或者将*(p+i)替换成*p++
}
printf(" ");
for(i=5;i>=0;i--)
{
printf("%s,",*(p+i));//或者将*(p+i)替换成*--p
}
return 0;
}
指针数组:
#include<stdio.h>
int main()
{
int i;
char*pch[6]={"妹","妹","你","坐","船","头"};
for(i=0;i<6;i++){
printf("%s,",pch<i>);
}
printf(" ");
for(i=5;i>=0;i--){
printf("%s ",pch<i>);
}
return 0;
}
⑵ C语言 为什么指向一维数组的指针是简单变量指针而不是数组指针
指向一维数组的指针也“不是简单变量指针而是数组指针”。你把一维数组首指针与指向一维数组的指针混淆了。操作一维数组就是操作一维数组的元素,而元素是挨个存放的,所以只需要其中一个元素(通常是下标为0的元素)的指针就可以通过加减一个常数或用下标操作所有元素了,所以操作一维数组的指针是指向元素的指针,不需要指向数组的指针。操作多维数组,比如二维数组,操作每个元素时使用的也是这一行的第一个元素的指针,与操作一维数组是一样的;而操作二维数组的整行时才用得着“指向数组”的指针。所以二维数组的指针是二级指针,第一级是“数组指针”,管数组的行,第二级就是元素指针,管每行的元素。所以我们通常所说的一维数组的指针是不严谨的,其实是第一个元素的指针,叫数组“首指针”。
⑶ 请问C语言里一维数组能用数组指针吗如果可以怎么用呢
数组指针可以指向一维数组的。
指针本来就是变量,是用来存放地址的变量。
如:
int (*a)[3],b[12];
a=b;
a++;
之后,*a相当于a[3]
⑷ C语言中:数组指针与指针数组有什么区别
数组指针是指向这个数组首地址的指针,指向对象是这个数组;
指针数组是存放一类指针的数组,这个数组的每个元素都是一个指针;
例子:
int a[10];
int* s;
s = a;//这里s就是一个数组指针,它的值就是数组a 的首地址;当然,如果a是一个整数,那s就是一个指向整型的指针;
int a;
int* s[5];
for(int i=0;i<5;i++)s[i]=a;
//这里s就是一个指针数组,它的每个元素都是整型变量a的地址
应该算比较明白了吧
谢楼上提醒
⑸ c语言中的指针数组和数组指针的区别
指针数组:数组里的每一个元素都是指针如*p[10],里面的 p[0] 到 p[9] 都是指针;
可参考:http://ke..com/link?url=UejdrqVcDuHTMC_8__WmHL4YUfjTnWfEywIGgkJ_HR7qwIXy7DrOZKO_
数组指针:指向一个数组的指针,如 arr[10] 是一个数组, 让一个指针指向这个数组 p = arr;
访问时通过 *(p + n) 或 p[n] 访问元素值,n为元素索引值;
可参考:http://ke..com/link?url=_
⑹ C语言指针数组、数组指针、函数指针、指针函数、字符串指针、
指针数组:
一个数组,其每个元素都是指针
数组指针:一个指针,指向一个数组(一般把数组首地址赋给指针)
函数指针:一个指针,指向一个函数(一般把函数栈的首地址赋给指针)
指针函数:
一个函数,
返回值类型为指针
字符串指针:一个指针,指向一个字符串(一般是把字符串的首地址赋给指针)
告诉你理解的方法:
短语名词中
第二个名词是主体,前面的是修饰的。
⑺ C语言中一维数组和指针有什么区别
指针都没初始化,运行个毛啊。
应该这样:
⑻ C语言一维数组指针
p=&a;才是=号两边类型匹配。因为p被声明为指向有4个元素的一维整型数组的指针,而a被定义为一个整型数组的第一个元素的指针,所以写成p=a;等号两边类型不匹配,连编译都过不了。而&a就是一个有4个整型元素的一维数组的指针——就是说在int a[4]={1,3,5,7};的定义后,a是1的地址,a+1就2的地址;而&a的值虽与a相同,但&a是整个数组{1,3,5,7}的地址,&a+1就指向7后面的那个单元了。而int (*p)[4];这种声明恰好就是&a的意思,即p是个指针,指向一个4元素整型数组,也就是p+1就要跳过4个int元素所占有的空间。
printf("%d ",(*p)[3]);中的(*p)[3]的意思是这样的:有了p=&a;后,p的地址“值”就是1的地址“值”,但意思是紧挨着存放的1,3,5,7这4个int数的首地址,*p后就是第一个元素1的地址了,那么(*p)[3]就向后移动3个元素位置,应该是7了……这里把*p用()括起来是因为[]的优先级比*高,不括起来就被解释成*(p[3])了,意思就大错了!
这里涉及的指针操作表述起来有些“绕”,得慢慢体会……
⑼ C语言中:数组指针与指针数组有什么区别
数组指针是指向这个数组首地址的指针,指向对象是这个数组;
指针数组是存放一类指针的数组,这个数组的每个元素都是一个指针;
例子:
int
a[10];
int*
s;
s
=
a;//这里s就是一个数组指针,它的值就是数组a
的首地址;当然,如果a是一个整数,那s就是一个指向整型的指针;
int
a;
int*
s[5];
for(int
i=0;i<5;i++)s[i]=a;
//这里s就是一个指针数组,它的每个元素都是整型变量a的地址
⑽ c语言一维数组与指针
由于你定义的int a[10],*p;a为数组,而你的p取的事数组a的首地址,此时p存放的地址就是数组a[0]所在内存中的地址,p+1则是数组中a[1]所在内存中的地址。p+x是这个一位数组中的元素所在的地址,此时p+x代表的就是a[x]的地址,*(p+x)就是取的p+x所指向地址中的值,所以说,*(p+x)就等同于a[1]。希望能解决您的问题