不是说数组和指针相似吗;那为什么数组比如a[i]前面不加*来去里面的东西,而是可以直接输出

作者&投稿:但纪 (若有异议请与网页底部的电邮联系)
因为数组名称就是一个指针了。
例如 int group[10];
这里数组名 group 就是一个指针(指针的类型是int*),
所以表达式 group[1] 就相当于 *(group+1);

若有一维数组a[10],一级指针变量*p=a.则以下四种表示方式等价:a[i] p[i] *(a+i) *(p+i).以上四种都表示元素a[i].

而p+i 和a+i等价,表示的都是&a[i].

是一样的,可以这样取内容
*(a+i)

定义:
char ch[10];
char ch2[];
char* str;
以及"string"。

1.全局的变量和函数内的static变量,存放在内存堆区域。
2.全局的数组和函数内定义的static的数组,存放在内存堆区域。
3.局部变量,数组,存放在内存的栈区域。
4.定义char ch[10]时,如果是全局或者static的,就在堆区域给他分配10byte的空间,并且如果用户没有给它初值,10byte数据全部置零。
5.定义char ch[10]时,如果是局部数组(在函数内定义且不是static的),则在栈区域分配10byte的空间,如果用户没有给它初值,10byte的数据未知,为内存中原来的不确定数据。
6.定义char * str时,给str分配一个4byte的空间,用于保存一个地址。该地址可以指向任意地方。如果没有给它初值,则其中数据是该片内存原来的数据,所以会指向一个不确定的地方,这时候如果对该指针指向的地方赋值,可能会因破坏未知地址内存数据,造成系统崩溃。
7.“string”在代码中出现时,自动分配空间,在内存中的存放是string\0,占用7个byte. “string”本身可以作为一个地址来看,该地址就是s字母所在的内存位置。
8.str=“string”是: 开始已经定义了一个char 指针str,且没指向任何地方。 该语句,把一个string字符串加上\0结束符存放在内存中,并且把该字符串的地址,也就是s的地址,即“string”给str,使str指向“string”所在的空间。
9.ch=“string”是不对的。 ch是一个数组。数组名虽然也就是数组第一个元素的地址。与指针有相似的地方。但是指针可以指向任意的地方。数组一旦定义,其地址就是固定的,数组名ch所指向的地方就只能是ch[0]的地址,是不能够修改的,不能够再指向其他的地方了。 这里可以理解为系统给ch数组分配了一段10byte的空间。“string”也有另一段7byte的空间,但是ch是不能重新指向“string”所在的地方的。
10.str=NULL同第8项。 str定以后,指向未知区域。 后面可以把str指向一个有效区域或者一个NULL区域。最好在定义的时候就给它指向NULL区域,以免出现第6项中的崩溃问题。在使用str的时候,再给它一个有效地址,如第8项中的赋值。
11.ch=NULL同第9项。ch作为数组名,内存是在定义时就分配好的。不能再指向其他地方,或者NULL。
12.在定义并初始化 char *str时,可以char *str=ch,数组ch的起始地址,给str,把该地址存放在str所在的4byte空间中。
12.在定义之后,赋值时,str=?? 是把??作为一个地址,给到str,存放在str所在的4byte的内存空间,如第6项。所以会出现类似str=ch2,或者str=“string”,这个语句的作用是让str指向其他的地址。另不能出现str=12等现象,因为12做作为一个地址,在内存中的数据是程序员不知道的,万一该地址的数据被修改了,会破坏系统数据,造成未知问题。
13.*str=?? 是把??作为一个字符,给到*str,存放在str所指向的地址内存空间。该语句的作用是改变str所指向的空间内所存储的值,而不会改变str所指向的地方。例如char *str=“string”; *str=‘F’,则以%s格式打印出str后,输出为Ftring。另%s格式输出,会一str所指向的地址开始,一直输出到\0结束。
14.??=*str,是把str所指向的地址的数据,赋值给??。 例如如果str指向“string”, 则char c=*str的作用等同于char c=‘s’。
15.ch为数组名,其指向的地方不能改变,但其指向的地方的内容可以改变。如ch=??不对。但是ch[0]='W'是正确的。
16.str是指针,指针本身占有4byte的存储空间,该空间内存储了一个数据,该数据是内存中其他地方的地址。所以可以通过修改该数据,来使str指向其他的地址,如第12项。也可以通过*str来修改str所指向的地址内所存储的数据,如第13条。
17.“string”是一个地址。该地址就是s字母所在的地址。他可以作为一个地址赋值给指针,如str=“string”(在指针str定义,并初始化时,可以char *str=“string”格式。)

18.ch的固定性,你可以把ch 按照 char * const ch理解。即ch指向的地址不能变。但ch指向地址内的数据可以变。

c语言中a+i是地址吗,书上说a+i是a[i]的指针,既然这样,那么*(a+i)为什么还是~

a+i其实就是&a[i],肯定是地址
*(a+i)其实就是a[i],如果a是二给数组的数组名,a[i]就肯定是地址(等同于&a[i][0]),如果a只是一维数组(指针数组除外)的数组名,a[i]就不是地址(原因是:二维数组可以看作是多个一维数组组成,即数组的数组)
*(a+i)+j就是&a[i][j],如果数组a是二维数组那就肯定也是地址啦
a[i][j]则是表示为*(*(a+i)+j)

*pt是 int *类型的变量,也就是说整形指针。
而pt是 int(*)[3]类型的,printf方法取的是指针的首地址开始到结束位置的内容。
所以无论你用pt 还是*pt都是一样的。
但是实际上pt和*pt却不是一样儿的。
你可以随便弄个指针,你在printf试试,输出的肯定是指针所指数据的值,而不是指针本身的地址的值。
pt指向的是数组的第一位,并且长度是数组的长度X指针类型的长度,也就是说pt的内容是整个数组。
*pt指向的是数组中的第一个整数,其长度是一个整数的长度,也就是*pt的内容就只是第一个元素的值。
你自己可以debug一下就知道了。我刚试过。

C语言数组与指针,请讲解为什么。
答:int (*p)[4];// 定义一个数组指针,指向含4个元素的一维数组,数组元素是int类型。int p[4];// 定义一个指针数组,数组中每个元素是一个指针,指针指向哪里就要根据程序来定了。判断数组指针与指针数组主要通过运算符的优先级来判断。int (*p)[4];// 由于()的优先级高,说明p是一个指针,...

指向指针的指针和二维数组名等同吗?
答:而p[1]表示的是指针p[1]所指向的地址,因此*p[1]和p[1]是不相同的。现在我们来看数组名p,数组名p表示的地址是&p[0],也就是指针p[0]的地址。要记住无论是多少维的数组,他的数组名都表示的是&a[0]的地址。具体的内容请下载本人文章《C指针与数组的混合运算》里面有讲解 ...

C语言的数组和指针问题,谢谢高手的解答!
答:所以, A是一个三级指针,指向了这个数组的第一个元素A[0],而A[0]是一3*4的二维数组。而A[0]是一个二维数组,也相当于一个二维数组名,它有A[0][0],A[0][1],A[0][2]三个元素,A[0]作为一个数组是指向它的第一个元素A[0][0]..而A[0][0]是一个大小为4的一维数组。。所以说...

C语言,为什么指针pf可以直接等于一个数组,而不用加&,指针不是应该等于一...
答:这里原因是xx是一个二维数组 xx[i] 等于 *xx + i 他是i行的首坐标 他还是一个数组~~不是地址 所以pf可以直接赋值~~~xx[i]如果xx是一个一维数组的话 pf就要+ *号

C++ 数组与指针
答:int a[10];这里限定长度为10个整数,所以长度为10*sizeof(int) = 40。int *b=a;由于b是指针,无论是否指向a,指向什么,sizeof(b)等于sizeof(int),32位平台上等于4。以上讨论的问题引发的关于数组名称的问题:数组名本身是个地址常量,但是某些特殊情况下它的语义可以发生改变。例如sizeof(a)...

C语言数组名和指针的区别?
答:数组和指针的区别:数组名确实表示指向数组首地址的指针,但这个指针很特别,它的值(指针的值指的是指针所指的地址)不能被改写,能改写的仅仅是其指向的内容,换句话说,数组名只能指向数组的首地址,如果有数组char a[];那么如果出现a = a+1;这是编译都通不过的错误。而对于一个普通的指针是可以...

C语言,指针和数组区别
答:char a[]是字符数组,char *a[]是指向字符串的指针数组。所以给字符串赋值char a[]={'I',' ','a','m',' ','h','a','p','p','y'};是正确的,相当于初始化一个字符串。但是char *a[]=[]={'I',' ','a','m',' ','h','...

关于C中指针与数组问题
答:a[6]而第二个声明的是是数组指针char *a[6]你可以把数组指针、指针数组、二维指针统统理解为二维数组。所以第一个中,a[1]只能代表一个char,而不能赋值为字符串。第二个钟,a[1]相当于char *c 其中c是一个char类型的指针,也就相当于char类型的一维数组。

C++的指针和数组问题
答:首先,你对指针没有弄明白,最后详细系统的了解一下指针的知识,这你可以参考C++语言程序设计教材的指针部分。第二,来说说本题,如果你把int *p; p=a;则可以实现如上的操作。这是为什么呢?因为,数组名即是一个指针(通常老师会这样告诉我们),而**p,它是一个指针的指针,即我们所说的二级指针...

c语言指针和数组
答:第一个单位为a[0][0]),即array[2][3],即12,所以程序输出12.也可以这样快速看出array[1][7]值为什么:arra[1]指向array[1][0],是数组的第5个元素.7表示让array[1]这个指针再后移7个单位.所以array[1][7]便是该数组的第12个单位也即array[2][3]了.所以输出12....