指针名与数组名

指针名与数组名 | 楼主 | 2016-06-15 13:32:45 共有3个回复
  1. 1指针名与数组名
  2. 2C和C++数组名与指针区别深入探索
  3. 3C数组名与指针区别

摘要:给个简单的输出二维数组各元素的值得程序,不相容的指针类型编译通过也是混乱的结果,实际情况是第行输出第行输出,我们还可以发现数组名显得像指针的例子,数组名指代一种数据结构数组。以下是小编整理的3篇最新指针名与数组名范文,欢迎参阅!

指针名与数组名2016-06-15 13:31:18 | #1楼回目录

关于指针和数组名

#include<math.h>

main()

{inti,j,a[5][5];

int*p=a;

clrscr();

for(i=0;i<5;i++)

for(j=0;j<5;j++)

a[i][j]=fabs(i-j)+1;

for(p=a;p<a+5;p++)

{if((p-a)%5==0)

printf("\n");

printf("%-3d",*p);

}

getch();

}

这个是打印一个矩阵的程序,结果我就不打出来了

我要问的是

for(p=a;p<a+5;p++)

{if((p-a)%5==0)

printf("\n");

printf("%-3d",*p);

}

p=a指针p指向了a的首地址那么这个a+5是代表什么就是这里我没弄明白它是a[4][4]的地址吗?

我认为的是a[0][0]到a[4][4]每隔5个地址回车一次.

希望高手能给我解答一下..

我知道物理地址是连续的,那么再给二维数组分配地址时候肯定也是连续的一块.那么到底这个数组怎么放呢?a[0][1]和a[1][0]谁先放?

谢谢!

问题补充:

恩.我那也提示指针转换后指向其他类型.什么意思?

有人能给我修改一下么?

请先告诉我a+5指的是哪里?

再告诉我指针怎么造成混乱及解决办法

\

c++后面看不懂..C++没接触过

最佳答案

楼上那个误导别人啊--||

晕,只要看懂上面一段文字就知道问题了吧

帮你修改了程序,没错了

代码如下,看看哪里不同自己体会下吧

#include<math.h>

#include<stdio.h>

#include<conio.h>

main()

{inti,j,a[5][5];

int*p=a[0];

//clrscr();

for(i=0;i<5;i++)

for(j=0;j<5;j++)

a[i][j]=fabs(i-j)+1;

for(p=a[0];p<a[0]+25;p++)

{if((p-a[0])%5==0)

printf("\n");

printf("%-3d",*p);

}

getch();

}

a代表二维数组首元素的地址,现在的首元素不是一个整型变量,而是由5个整型元素所组成的一维数组,因此a代表的是首行的起始地址,(即第0行的起始地址,&a[0]),a+1代表a[1]行的首地址,即&a[1]。a+5就是代表a[5]行的首地址,即&a[5],

你那里赋值P是错误的,原因是a指向的是a[0](二维数组的首行,即指向一个一维数组),与P的类型不匹配,(p是指向整型数据的指针变量),编译时会出错的||

给个简单的输出二维数组各元素的值得程序

#include<iostream>

usingnamespacestd;

intmain()

{inta[3][4]={1,3,4,5,7,8,9,5,2,4,6,7};

int*p;

for(p=a[0];p<a[0]+12;p++)

cout<<*p<<"";

cout<<endl;

return0;

}

理解上面的你就知道程序出什么错了

更多等待您来回答的问题>>

其他回答共2条

int*p=a;[Warning]initializationfromincompatiblepointertype

不相容的指针类型,编译通过也是混乱的结果

回答者:fuchuangbob|五级|2016-9-2615:24

我很久没有搞过了,有点依稀记忆。

a+5应该是指向a[0][4],然后数组的排序是从a[0][0],a[0][1]。。。a[1][0]。。这么个顺序。所以a+5就是移5个地址就是了。

我没有调试环境,不过你可以试下下面的办法:

int**p=a;

如果可以的话,后面也许还有错误。

如果你理解,那么这些错误当是留给你的作业吧。

C和C++数组名与指针区别深入探索2016-06-15 13:30:17 | #2楼回目录

引言

指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用。于是乎,很多程序设计者就被搞糊涂了。而许多的大学老师,他们在C语言的教学过程中也错误得给学生讲解:"数组名就是指针"。很幸运,我的大学老师就是其中之

一。时至今日,我日复一日地进行着C/C++项目的开发,而身边还一直充满这样的程序员,他们保留着"数组名就是指针"的误解。

想必这种误解的根源在于国内某著名的C程序设计教程。如果这篇文章能够纠正许多中国程序员对数组名和指针的误解,笔者就不甚欣慰了。借此文,笔者站在无数对知识如饥似渴的中国程序员之中,深深寄希望于国内的计算机图书编写者们,能以"深入探索"的思维方式和精益求精的认真态度来对待图书编写工作,但愿市面上多一些融入作者思考结晶的心血之作!

魔幻数组名

请看程序(本文程序在WIN32平台下编译):

1.#include

http://oh100.com main(intargc,char*argv[])

3.{

4.charstr[10];

5.char*pStr=str;

http://oh100.com ut<<sizeof(str)<<endl;

http://oh100.com ut<<sizeof(pStr)<<endl;

8.return0;

9.}

1、数组名不是指针

我们先来推翻"数组名就是指针"的说法,用反证法。

证明数组名不是指针

假设:数组名是指针;

则:pStr和str都是指针;

因为:在WIN32平台下,指针长度为4;

所以:第6行和第7行的输出都应该为4;

实际情况是:第6行输出10,第7行输出4;

所以:假设不成立,数组名不是指针

2、数组名神似指针

上面我们已经证明了数组名的确不是指针,但是我们再看看程序的第5行。该行程序将数组名直接赋值给指针,这显得数组名又的确是个指针!

我们还可以发现数组名显得像指针的例子:

1.#include

2.#include

http://oh100.com main(intargc,char*argv[])

4.{

5.charstr1[10]="ILoveU";

6.charstr2[10];

7.strcpy(str2,str1);

http://oh100.com ut<<"stringarray1:"<<str1<<endl;

http://oh100.com ut<<"stringarray2:"<<str2<<endl;

10.return0;

11.}

标准C库函数strcpy的函数原形中能接纳的两个参数都为char型指针,而我们在调用中传给它的却是两个数组名!函数输出:

stringarray1:ILoveU

stringarray2:ILoveU

数组名再一次显得像指针!

既然数组名不是指针,而为什么到处都把数组名当指针用?于是乎,许多程序员得出这样的结论:数组名(主)是(谓)不是指针的指针(宾)。

整个一魔鬼。

揭密数组名

现在到揭露数组名本质的时候了,先给出三个结论:

(1)数组名的内涵在于其指代实体是一种数据结构,这种数据结构就是数组;

(2)数组名的外延在于其可以转换为指向其指代实体的指针,而且是一个指针常量;

(3)指向数组的指针则是另外一种变量类型(在WIN32平台下,长度为4),仅仅意味着数组的存放地址!

1、数组名指代一种数据结构:数组

现在可以解释为什么第1个程序第6行的输出为10的问题,根据结论1,数组名str的内涵为一种数据结构,即一个长度为10的char型数组,所以sizeof(str)的结果为这个数据结构占据的内存大小:10字节。

再看:

http://oh100.com intArray[10];

http://oh100.com ut<<sizeof(intArray);

第2行的输出结果为40(整型数组占据的内存空间大小)。

如果C/C++程序可以这样写:

http://oh100.com [10]intArray;

http://oh100.com ut<<sizeof(intArray);

我们就都明白了,intArray定义为int[10]这种数据结构的一个实例,可惜啊,C/C++目前并不支持这种定义方式。

2、数组名可作为指针常量

根据结论2,数组名可以转换为指向其指代实体的指针,所以程序1中的第5行数组名直接赋值给指针,程序2第7行直接将数组名作为指针形参都可成立。

下面的程序成立吗?

http://oh100.com intArray[10];

http://oh100.com Array++;

读者可以编译之,发现编译出错。原因在于,虽然数组名可以转换为指向其指代实体的指针,但是它只能被看作一个指针常量,不能被修改。

而指针,不管是指向结构体、数组还是基本数据类型的指针,都不包含原始数据结构的内涵,在WIN32平台下,sizeof操作的结果都是4。

顺便纠正一下许多程序员的另一个误解。许多程序员以为sizeof是一个函数,而实际上,它是一个操作符,不过其使用方式看起来的确太像一个函数了。语句sizeof(int)就可以说明sizeof的确不是一个函数,因为函数接纳形参(一个变量),世界上没有一个C/C++函数接纳一个数据类型(如int)为"形参"。

3、数据名可能失去其数据结构内涵

到这里似乎数组名魔幻问题已经宣告圆满解决,但是平静的湖面上却再次掀起波浪。请看下面一段程序:

1.#include

2.voidarrayTest(charstr[])

3.{

http://oh100.com ut<<sizeof(str)<<endl;

5.}

http://oh100.com main(intargc,char*argv[])

7.{

8.charstr1[10]="ILoveU";

9.arrayTest(str1);

10.return0;

11.}

程序的输出结果为4。不可能吧?

一个可怕的数字,前面已经提到其为指针的长度!

结论1指出,数据名内涵为数组这种数据结构,在arrayTest函数体内,str是数组名,那为什么sizeof的结果却是指针的长度?这是因为:

(1)数组名作为函数形参时,在函数体内,其失去了本身的内涵,仅仅只是一个指针;

(2)很遗憾,在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。

所以,数据名作为函数形参时,其全面沦落为一个普通指针!它的贵族身份被剥夺,成了一个地地道道的只拥有4个字节的平民。

以上就是结论4。

结束语

最后,笔者再次表达深深的希望,愿我和我的同道中人能够真正以谨慎的研究态度来认真思考开发中的问题,这样才能在我们中间产生大师级的程序员,顶级的开发书籍。每次拿着美国鬼子的开发书籍,我们不免发出这样的感慨:我们落后太远了。

C数组名与指针区别2016-06-15 13:29:49 | #3楼回目录

指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用。于是乎,很多程序设计者就被搞糊涂了。而许多的大学老师,他们在C语言的教学过程中也错误得给学生讲解:"数组名就是指针"。很幸运,我的大学老师就是其中之一。时至今日,我日复一日地进行着C/C++项目的开发,而身边还一直充满这样的程序员,他们保留着"数组名就是指针"的误解。想必这种误解的根源在于国内某著名的C程序设计教程。如果这篇文章能够纠正许多中国程序员对数组名和指针的误解,笔者就不甚欣慰了。借此文,笔者站在无数对知识如饥似渴的中国程序员之中,深深寄希望于国内的计算机图书编写者们,能以"深入探索"的思维方式和精益求精的认真态度来对待图书编写工作,但愿市面上多一些融入作者思考结晶的心血之作!

魔幻数组名

请看程序(本文程序在WIN32平台下编译):

1.#include<iostream.h>

http://oh100.com main(intargc,char*argv[])

3.{

4.charstr[10];

5.char*pStr=str;

http://oh100.com ut<<sizeof(str)<<endl;

http://oh100.com ut<<sizeof(pStr)<<endl;

8.return0;

9.}

1、数组名不是指针

我们先来推翻"数组名就是指针"的说法,用反证法。

证明数组名不是指针

假设:数组名是指针;

则:pStr和str都是指针;

因为:在WIN32平台下,指针长度为4;

所以:第6行和第7行的输出都应该为4;

实际情况是:第6行输出10,第7行输出4;

所以:假设不成立,数组名不是指针

2、数组名神似指针

上面我们已经证明了数组名的确不是指针,但是我们再看看程序的第5行。该行程序将数组名直接赋值给指针,这显得数组名又的确是个指针!我们还可以发现数组名显得像指针的例子:

1.#include<string.h>

2.#include<iostream.h>

http://oh100.com main(intargc,char*argv[])

4.{

5.charstr1[10]="ILoveU";

6.charstr2[10];

7.strcpy(str2,str1);

http://oh100.com ut<<"stringarray1:"<<str1<<endl;

http://oh100.com ut<<"stringarray2:"<<str2<<endl;

10.return0;

11.}

标准C库函数strcpy的函数原形中能接纳的两个参数都为char型指针,而我们在调用中传给它的却是两个数组名!函数输出:

stringarray1:ILoveU

stringarray2:ILoveU

数组名再一次显得像指针!

既然数组名不是指针,而为什么到处都把数组名当指针用?于是乎,许多程序员得出这样的结论:数组名(主)是(谓)不是指针的指针(宾)。整个一魔鬼。

揭密数组名

现在到揭露数组名本质的时候了,先给出三个结论:

(1)数组名的内涵在于其指代实体是一种数据结构,这种数据结构就是数组;

(2)数组名的外延在于其可以转换为指向其指代实体的指针,而且是一个指针常量;

(3)指向数组的指针则是另外一种变量类型(在WIN32平台下,长度为4),仅仅意味着数组的存放地址!

1、数组名指代一种数据结构:数组

现在可以解释为什么第1个程序第6行的输出为10的问题,根据结论1,数组名str的内涵为一种数据结构,即一个长度为10的char型数组,所以sizeof(str)的结果为这个数据结构占据的内存大小:10字节。

再看:

http://oh100.com intArray[10];

http://oh100.com ut<<sizeof(intArray);

第2行的输出结果为40(整型数组占据的内存空间大小)。

如果C/C++程序可以这样写:

http://oh100.com [10]intArray;

http://oh100.com ut<<sizeof(intArray);

我们就都明白了,intArray定义为int[10]这种数据结构的一个实例,可惜啊,C/C++目前并不支持这种定义方式。

2、数组名可作为指针常量

根据结论2,数组名可以转换为指向其指代实体的指针,所以程序1中的第5行数组名直接赋值给指针,程序2第7行直接将数组名作为指针形参都可成立。下面的程序成立吗?

http://oh100.com intArray[10];

http://oh100.com Array++;

读者可以编译之,发现编译出错。原因在于,虽然数组名可以转换为指向其指代实体的指针,但是它只能被看作一个指针常量,不能被修改。

而指针,不管是指向结构体、数组还是基本数据类型的指针,都不包含原始数据结构的内涵,在WIN32平台下,sizeof操作的结果都是4。

顺便纠正一下许多程序员的另一个误解。许多程序员以为sizeof是一个函数,而实际上,它是一个操作符,不过其使用方式看起来的确太像一个函数了。语句sizeof(int)就可以说明sizeof的确不是一个函数,因为函数接纳形参(一个变量),世界上没有一个C/C++函数接纳一个数据类型(如int)为"形参"。

3、数组名可能失去其数据结构内涵

到这里似乎数组名魔幻问题已经宣告圆满解决,但是平静的湖面上却再次掀起波浪。请看下面一段程序:

1.#include<iostream.h>

2.voidarrayTest(charstr[])

3.{

http://oh100.com ut<<sizeof(str)<<endl;

5.}

http://oh100.com main(intargc,char*argv[])

7.{

8.charstr1[10]="ILoveU";

9.arrayTest(str1);

10.return0;

11.}

程序的输出结果为4。不可能吧?

一个可怕的数字,前面已经提到其为指针的长度!

结论1指出,数组名内涵为数组这种数据结构,在arrayTest函数体内,str是数组名,那为什么sizeof的结果却是指针的长度?这是因为:

(1)数组名作为函数形参时,在函数体内,其失去了本身的内涵,仅仅只是一个指针;

(2)很遗憾,在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。

所以,数组名作为函数形参时,其全面沦落为一个普通指针!它的贵族身份被剥夺,成了一个地地道道的只拥有4个字节的平民。

以上就是结论4。

结束语

最后,笔者再次表达深深的希望,愿我和我的同道中人能够真正以谨慎的研究态度来认真思考开发中的问题,这样才能在我们中间产生大师级的程序员,顶级的开发书籍。每次拿着美国鬼子的开发书籍,我们不免发出这样的感慨:我们落后太远了。

回复帖子
标题:
内容:
相关话题