㈠ c语言指针数组问题
char *a={"abc"}; a 是指针。
char c[]={"abc"}; c 是数组。
初始化后 sizeof(a) 为 4,strlen(a) 为3。
同样,sizeof(c) 为 4,strlen(c) 为3。
在语句中有时一样,有时不一样。
例如:
char *a={"abc"};
char c[]={"abc"};
char b[]={"123"};
int L;
L = sizeof(a);
printf("a: %d %s\n",L, a);
a=b; // a 允许
L = sizeof(a);
printf("a: %d %s\n",L, a);
L = sizeof(c); // a,c 方法一样
printf("c: %d %s\n",L, c); // a,c 方法一样
// wrong c=b; // c 不允许
strcpy(c,b); // c 只能这样做
L = sizeof(c);
printf("c: %d %s\n",L, c);
注意 a=b; 允许。c=b; 不允许 。 只能 strcpy(c,b);
输出:
a: 4 abc
a: 4 123
c: 4 abc
c: 4 123
㈡ c语言指针数组
p是int类型指针,指向数组a的第1个元素即一个一维的数组{1,2,3}首地址所以p[1]相当于a[0][1]所以printf("%d\n",p[1]);
输出2 。 int **pp =pa 是声明了一个指向pa的指针,而pa又是指向a首地址的int类型指针。pa指向的是a的第一维,pa[0] = a[0] ,pp[2][1]相当于a[2][1]而a数组的[2]中只初始化了[2][0]位置的7,那[2][1]位置就是默认的值0,所以printf("%d\n",pp[2][1]);
输出0
㈢ C语言 指针数组的使用
int**a可以表达一个二维数组。为什么呢?
你可以这么理解*p[3]表达的是一个数组指针,这个指针p[0]表示的是数组存的第一个地址。而数组实际上是一串连续地址的块。每一个小块存着一个内容。每次访问数组时,你为什么可以用数组名+下标访问呢?//比如a[i];
实际上就是访问*a+i;*这个符号可以表示你存的是变量的地址。而数组地址的第一位为int类型变量存的地址(你可以直接使用数组的地址加上单位变量的空间的大小去访问下个元素)。在这个程序中int*p[3]表示可以存三个int类型的地址。而p正好把二维数组的三个一维数组的开头的int类型变量的地址给存起来了。
给你举个例子
实际上p[i]与 *(p+i)是表达的是同一个意思。只不过只有数组可以定义一个连续的空间
(数组的第一个地址是随机的其他的是连续的。)单独用指针的话会随机分配的
数组的指针可以存三个地址。当然可以访问二维数组了。
㈣ c语言指针数组问题
这个题目比较蛋疼,但是只要理解指针,其实也不难理解
就是手工计算繁琐一点
二维数组,相当于两层指责你,**
*(*(a+i)+j)这个表示第i行第j个元素的值,。如果不理解,记住即可
有两个*,是两层指针
pa看了你没问题
关键是p
p在程序中有定义,在pa的后面
a a[0] &a[0][0]这三个指针虽然只想同一个地方,是a首地址的值,但是用起来是不一样的
㈤ c语言指针,指向数组的指针、指向指针数组的指针、指向数组的指针的指针,分别如何定义
解答:
1. 如何声明一个指针,这个指针是指向整个数组的,数组有n个元素,每个元素是int,不是int (*p)[n],而是最简单的int*p;
2. 如何声明一个指针,这个指针也是指向数组的,数组有n个元素,每个元素不是int,而是指针int*;这个指针是int**p;
3. 又如何声明一个指针,它指向另一个指针,这“另一个指针”指向一个数组,数组元素是int;这个指针仍然是int**p。
㈥ c语言数组指针
② 指向iArray[1]输出2 (因为*(++p)是先自加然后取指针内容)
③ 指向iArray[1]输出4 (因为②时p已经成了1,p+2就是3,iArray[3]就是4)
④ 指向iArray[0]输出2 (因为*(p--)相当于 *(p) ;p--; 是先取值, 然后自减,自减后p=0)
/******
④有异议 不管怎么样, 输出的都是2 ,因为假如是 printf("%d",$(p--)); 则是 printf("$d,$p");p--; 就是输出的时候, p是指向iArray[1], 但是输出后就变成了指向iArray[0]了,-----------这里问的p指向:如果是输出时的指向, 就是iArray[1],如果是输出后的指向, 就是iArray[0] ,因为这里先问的输出,又问的指向,所以当作是输出后指向 所以是iArray[0]
*******/
⑤ 指向iArray[0]输出1 (因为*p++ 是得到p指向的值之后,把那个值自加 ,但是*p++是先使用*p然后*p自加所以输出的时候还是*p的内容 ,但是注意, 这时*p已经是2了,也就是iArray[0]从1变成了2)
⑥ 指向iArray[0]输出2 (因为p是指向数组的索引0的位置,⑤中指针位置没变,变得是里面的值,本来是1, ⑤之后变成了2)
⑦ 指向iArray[0]输出3 (因为++(*p)是取出*p之后, 自加, 然后输出,所以*p是2 2++是3)
⑧ 指向iArray[0]输出3 (⑦中没改变指针, 只改变了指针指向的位置的值, 是⑦中2++的结果,是3)
/*
这里考验的是i++ 和++ i的区别
比如 a=i++; 相当于 a=i; i++;
而 a=++i ; 则相当于 i++;a=i;
一个是先赋值再递加,一个是先递加再复制
另一个是考*p++和*(p++)的区别, *p++改变的是*p的值就是指针指向的值 , 而*(p++)改变的是p的值
*/
㈦ C语言 指针数组
数组指针(也称行指针)
定义 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][]
所以数组指针也称指向一维数组的指针,亦称行指针。
指针数组
定义 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[3];
int a[3][4];
p++; //该语句表示p数组指向下一个数组元素。注:此数组每一个元素都是一个指针
for(i=0;i<3;i++)
p[i]=a[i]
这里int *p[3] 表示一个一维数组内存放着三个指针变量,分别是p[0]、p[1]、p[2]
所以要分别赋值。
㈧ 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][]
(9)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语言指针数组指针怎样理解
指针数组,指数组元素就是指针
数组指针,对于一维数组来说就是数组名
故对于一维数组来说,数组名是第一个元素的指针,而元素本身也是指针,故数组名是指向指针的指针。
例如:int*p=&a;int**q=&p;
则p中储存的是整形变量a的地址,而指针p自身也是变量(指针变量通常占4个字节),故q中储存的就是变量p的地址。q就成了指向指针的指针。