㈠ c语言数组指针
int (*p2)[5] = &temp;这是一个指针数组;第一个元素存储的是数组temp的首地址;
*p2等价于&temp; **p2等价于temp数组的第一个元素的值1;
*(*p2+i);等价于*(&temp+i),等价于temp[i];
㈡ 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][]
(2)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语言数组指针
p2里面放的都是指针,通过定义就可以看到,每个指针对应temp数组的一个元素。
所以*p2是一个地址,加一个数仍然是地址,然后用*取值
㈣ c语言中的数组指针
这时b代表数组第一个元素b[0][0]的地址,*b就是b[0][0]的值
1.
*b+1表示b[0][0]+1的值
2.
*(b+1)
首先地址b加一,此时就是b[0][1]的地址,故此表达式相当于*(&b[0][1]),也就是b[0][1]的值
3.
*(b+1)+1
由上面知此式表示b[0][1]的值加1
㈤ C语言数组指针
1数组指针强调是一个指针,这个指针指向的是一个数组,把数组名给这个指针就是对数组指针赋值了。
2二维数组里的每个元素是什么要看你把这个二维数组定义成什么类型,例如:char num[3][3],数组里每个元素是为char类型开辟的那么大的一块内存,可以存char类型数据。二维数组名是整个二维数组的首地址,a=&a[0]=&a[0][0]=a[0]值都是二维数组的首地址的值。
指针数组名是一块开辟好的内存的首地址,是常量,比如a[0],指向数组的第一块内存区域,那块内存区域里是可以赋值的,明白了吧。
char *ss[6];ss[1]="right?"这句先定义一个char类型的指针数组,强调是一个数组,里边的元素是指针,指针是指向char类型数据的,ss[1]是指针数组的第二个元素,是一个指针,指针的指向是“right”字符串的首地址。
char ss[6][20];ss[1]="right?"是定义一个二维字符数组,横6纵20,起迷惑作用的!二维数组里ss[0], ss[1]等代表的是第一行,第二行的首地址,ss[0][3]是第一行第四个元素,ss[1][3]代表第二行第四个元素。
3第三个问题再用我讲你就直接改行吧!!哈哈哈
祝你学习进步!!
㈥ C语言 指针数组的使用
int**a可以表达一个二维数组。为什么呢?
你可以这么理解*p[3]表达的是一个数组指针,这个指针p[0]表示的是数组存的第一个地址。而数组实际上是一串连续地址的块。每一个小块存着一个内容。每次访问数组时,你为什么可以用数组名+下标访问呢?//比如a[i];
实际上就是访问*a+i;*这个符号可以表示你存的是变量的地址。而数组地址的第一位为int类型变量存的地址(你可以直接使用数组的地址加上单位变量的空间的大小去访问下个元素)。在这个程序中int*p[3]表示可以存三个int类型的地址。而p正好把二维数组的三个一维数组的开头的int类型变量的地址给存起来了。
给你举个例子
实际上p[i]与 *(p+i)是表达的是同一个意思。只不过只有数组可以定义一个连续的空间
(数组的第一个地址是随机的其他的是连续的。)单独用指针的话会随机分配的
数组的指针可以存三个地址。当然可以访问二维数组了。
㈦ c语言怎么将字符数组按两个字节存入指针数组
给你举个例子,这里str就是一个二维数组,我手动输入10个字符串存入该数组,然后用该二维数组的行指针输出
#include<stdio.h>
#include<string.h>
void main()
{
char str[10][20];
int i;
for(i=0;i<10;i++)
gets(*(str+i));
for(i=0;i<10;i++)
puts(*(str+i));
}
㈧ C语言指针数组指针怎样理解
指针数组,指数组元素就是指针
数组指针,对于一维数组来说就是数组名
故对于一维数组来说,数组名是第一个元素的指针,而元素本身也是指针,故数组名是指向指针的指针。
例如:int*p=&a;int**q=&p;
则p中储存的是整形变量a的地址,而指针p自身也是变量(指针变量通常占4个字节),故q中储存的就是变量p的地址。q就成了指向指针的指针。
㈨ 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语言数组指针问题
首先你要明白一点,数组名和指针本质上是一回事,都是地址,该数组的首地址。知道这一点后就可以活学活用了。这是c语言的精髓。
比如你定义了int
*p,a[10];并且让p=a;,
这个操作叫做指针p指向了数组a,其本质是给p这个变量付了一个值,就是数组a的地址,也是a[0]的地址,也是a本身里面存储的内容。
那么要引用a[i],你可以有很多种写法,比如*(a+i),
*(p+i),
p[i],都是等效的。
p++的含义其实不是p=p+1,至少有时不是,p++的操作其实是让p指向下一个元素,也就是原来p指向的是a[0],那么现在p指向a[1]了。由于a是int类型,站4个字节,那么p++这个操作其实是让p的内容增加了4。不要问为什么,c语言就是这么规定的。如果p指向的是一个char类型,那么p++就使p的值增加1。