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。
以上代码段
char p[]={"world"};
cout<<p[0]<<endl;
p[0]的类型是字符类型,cout会按照字符输出;
char *p[]={"world"};
cout<<p[0]<<endl;
p[0]的类型是字符指针,cout会按照字符串输出。
比如你定义了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。
由于p是指针,所以p=a表示指向了这个数组的首元素地址,p++当然就表示指向下一个
如果要表示a[i]的话,
最常用a[i],也可以*(a+i),也可以是*(p+i)
C语言规定:表达式1[表达式2]与
*((表达式1)+(表达式2))完全等价,也可以说
a[b]与b[a]也完全等价,也就是说a[i]和i[a]也是完全等价,你可以试试
*p
*a
p=a表示把数组的第一个地址赋值给指针p
这样指针就指向数组了
p++表示指针p地址加1
这样就指向后一个地址
C语言中的指向数组的指针怎么理解?
数组名并不是一个普通的变量,而是一个指向数组首元素的指针。也就是说,我们可以用数组名来初始化一个对应类型的指针。虽然数组名是指针,但它是一个指针常量。也就是说,不带下标的数组名不能作为左值。指针是一种数据类型,所以,我们可以用指针类型来创建一个数组。声明一个指针数组的语句格式是:...
c语言指针,指向数组的指针、指向指针数组的指针、指向数组的指针的指...
解答:1. 如何声明一个指针,这个指针是指向整个数组的,数组有n个元素,每个元素是int,不是int (*p)[n],而是最简单的int*p;2. 如何声明一个指针,这个指针也是指向数组的,数组有n个元素,每个元素不是int,而是指针int*;这个指针是int**p;3. 又如何声明一个指针,它指向另一个指针,这“...
如何使用指针指向数组里面的元素?
1.使用列指针:定义一个列指针p,让它指向二维数组的第0个元素 int a[3][4];int *p;p=&a[0][0];\/\/因为a[0]是第0行的数组名,所以p=&a[0][0]相当于p=a[0],因为a[i][j]前面共有i*4+j个元素 该二维数组的任意i行j列元素可表示为*(p+i*4+j)。2.使用行指针:定义一个...
c语言指针指向数组的问题。
首先你要明白一点,数组名和指针本质上是一回事,都是地址,该数组的首地址。知道这一点后就可以活学活用了。这是c语言的精髓。比如你定义了int p,a[10];并且让p=a;,这个操作叫做指针p指向了数组a,其本质是给p这个变量付了一个值,就是数组a的地址,也是a[0]的地址,也是a本身里面存储的内...
C语言指针数组指针怎样理解?
指针数组,指数组元素就是指针 数组指针,对于一维数组来说就是数组名 故对于一维数组来说,数组名是第一个元素的指针,而元素本身也是指针,故数组名是指向指针的指针。例如: int * p = &a; int ** q = &p;则p中储存的是整形变量a的地址,而指针p自身也是变量(指针变量通常占4个字节),故...
如何让指针指向数组尾部
= &a[sizeof(a)\/sizeof(a[0])-1]; \/\/ sizeof(a)\/sizeof(a[0])求出数组a中元素的个数,由于C语言中数组下标从0开始,\/\/ 所以减1后就是指向最后一个元素。也即指针p指向了数组的尾部。\/\/ p = &a[sizeof(a)\/sizeof(a[0])-1]; 相当于p = &a[5-1];...
c语言中指针怎么使用?
1、使用场景 使用指针时,必须将它指向一个变量的地址或者为它分配空间方能使用,如下所示:include<stdio.h> include <stdlib.h> int main(int argc, char const *argv[]){ int a[5]={0,1,2,3,4};int *b,*d;int c=2;int *e=a; \/\/e指向a数组首地址 \/\/*b=2; 无法直接初始...
C语言中,如何定义一个‘指针数组’,这个‘指针数组’专门用来存放‘数组...
数组指针定义int(*p)[n];()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。如要将二维数组赋给一指针,应这样赋值:int a[3][4];int(*p)[4];\/\/该语句是定义一个数组指针,指向含4个...
C语言问题,如何用指针指向未知长度的数组的末尾?
楼主,可以用指针解决,即让指针开始指向数组首地址,然后P++,直到遇到\\0为止。例子:int a[20]={1,2,3,4} int *p=a \/*p指向数组a首地址*\/ while(*p) \/*这要有值,就为真,p不断往后指*\/ ++p;--p; \/*注意,p最后还会下移一位,指到了\\0,向前一位就指到了末尾的值的了*\/ ...
如何定义一个指向数组的指针
char *pc[10]; \/*定义一个10个元素的指针数组,元素为指向char型变量的指针变量*\/ 不论指针数组是什么类型,指针数组的每个数组元素都用来保存一个地址值,在TurboC下,每个数组元素是一个unsigned int型变量,占用2个字节。指针数组定义后,可以使数组元素指向一个变量和其他数组的首地址。下面是一个...
薄张皮肤: 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 = ...
福鼎市19428689974: c语言指针指向数组的问题. - ?
薄张皮肤: 首先你要明白一点,数组名和指针本质上是一回事,都是地址,该数组的首地址.知道这一点后就可以活学活用了.这是c语言的精髓.比如你定义了int *p,a[10];并且让p=a;, 这个操作叫做指针p指向了数组a,其本质是给p这个变量付了一个...
福鼎市19428689974: C语言中指针能否指向指针数组的元素 - ?
薄张皮肤: int *p[4] ; //指针数组p 里面有四个数组元素,且每个元素都是指针 如果想用指针指向数组p中的元素,可以如下定义: int **q; //q必须是二级指针 q=&p[0]; //指针q指向数组p中的第一个元素 .... q=&p[3]; //指针q指向数组p中的最后一个元素
福鼎市19428689974: C语言问题,指针指向数组.使指针变量p指向数组a的第三个元素,p=&a+2可以吗?如果不可以,它是 - ?
薄张皮肤: int a[10] ; int *p=a ; //定义一维指针p,并指向数组a首地址.p=a+2 ; //指向数组a的第三个元素 或写成:p= &a[2] ; //通过&运算符号来取a[2]的地址,赋值给p p=&a ; //这是错误的语句!因为,&a的类型是int **, 而p是int *类型,所以,类型不相符,不能进行赋值操作.
福鼎市19428689974: C语言中关于指向数组的指针 - ?
薄张皮肤: char str[100]; char *pi=str; //相当于char *pi ;pi=str; char **ppi=*pi;//这个地方抄错了.应为char **ppi=π定义加*表明这是指针类型的变量 用的时候,就是用的指针,加*干什么.只有取指针所指变量的值,或给指针所指的变量赋值的等涉及指针所指的变量的时候,才会又加*号,表示获取或改变,指针所指变量的值.char x=10;*pi =x; //给指针所指的变量赋值,改变指针所指变量的值(改变*pi) .x=*pi; //取指针所指的值,取指针pi所指的变量的值(表示为*pi)赋值给x.
福鼎市19428689974: c语言中的指针数组问题?
薄张皮肤: *p+i,是先执行*p,然后再加i 如int a[2]={1,2}; int *p; p=a;//p指向数组a,即指向数组a的第一个元素,即1 那么*p=1;*p+1=1+1=2;*p+3=1+3=4; *p[i],p[i]本身就是一个指针,*p[i]取p[i]这个指针所指向的内容. 如int b[2][2]={1,2,3,4} int *p[2];//定义指针...
福鼎市19428689974: C程序指针数组问题 - ?
薄张皮肤: 把你的问题具体点说:char* p[2 ]和char (*p)[2 ] 无非是指针数组和数组指针的理解:1、先看char* p[ 2] 由于*是自右向左结合的,所以首先它是一个数组,然后是char*类型的,所以char* p[ ]是一个存放指针类型的数组(即:存放char类型变量的地...
福鼎市19428689974: C语言,指针数组的问题,代码在下面 - ?
薄张皮肤: a 是一个 U8 指针,a[0] 相当于 *(a + 0), a[1] 相当于 *(a + 1), a[2] 相当于 *(a + 2).一个 U8 数组(如U8 a[10])的数组名是这个数组的开始地址,所以一般这种函数是接受一个数组作为参数.
福鼎市19428689974: c语言指针数组问题?
薄张皮肤: 错误,指针类型不符. a是一个二维数组,而C里的二维数组其实就是数组的数组,你可以理解a为一个一维数组,只不过这个数组的每个元素都是一个包含10个元素的一维数组. 在C里,当直接使用数组名时,它的类型等于指向数组第一个元素的指针,也就是指向a[0]的指针,而a[0]的类型是int [10], 所以p的类型应该是int (*p)[10]; 上面改为: int a[4][10],(*p)[10];p=a; 注意这里是如何定义指向数组的指针,[]运算符的优先级高于*,所以用括号(*p)来说明这里是一个指针, 如果是这样int *p[10]就是定义一个指针数组而不是数组指针了.
福鼎市19428689974: C语言数组指针的问题 - ?
薄张皮肤: 1234567 intmain() { chara[5]={'A','B','C','D'}; char(*p3)[5] = &a; char(*p4)[5] = a; return0; } 个人感觉 char (*p4)[5] = a;这一句应该会出现语法错误,char (*p3)[5] = &a;这一句表示p3是一个一维五个字符的数组的地址,所以p3的值是数组a[5]的起始地址,p3+1应该是首地址加5;后面的修改代码应该都是不合法的,用VC6编译应该会出错(以前我刚学的时候试过)