c语言问题
谁能给我分析下指针与一维数组和二维数组的相互关系。我经常看到S[i]有时是表示地址又有时是表示元素值,有时候我觉得s[m++]前面加一个*才表示元素值可答案有没加。这些我...
谁能给我分析下指针与一维数组和二维数组的相互关系。
我经常看到S[i]有时是表示地址又有时是表示元素值,有时候我觉得s[m++]前面加一个*才表示元素值可答案有没加。
这些我都是自学的,我想可能是我对指针与数组这一节还没有形成很好的体系,愿大家能帮帮我~~ 展开
我经常看到S[i]有时是表示地址又有时是表示元素值,有时候我觉得s[m++]前面加一个*才表示元素值可答案有没加。
这些我都是自学的,我想可能是我对指针与数组这一节还没有形成很好的体系,愿大家能帮帮我~~ 展开
展开全部
数组和指针的关系
如果对声明数组的语句不太明白的话,请参阅<<如何理解c和c++的复杂类型声明>>, 数组的数组名其实可以看作一个指针,看下例:
例八:
int array[10]={0,1,2,3,4,5,6,7,8,9},value;
...
...
value=array[0];//也可写成:value=*array;
value=array[3];//也可写成:value=*(array+3);
value=array[4];//也可写成:value=*(array+4);
上例中,一般而言数组名array代表数组本身,类型是int [10],但如果把array看做指针的话,它指向数组的第0个单元,类型是int *,所指向的类型是数组单元的类型即int。因此*array等于0就一点也不奇怪了。同理,array+3是一个指向数组第3个单元的指针,所以*(array+3)等于3。其它依此类推。
例九:
char *str[3]={
"Hello,this is a sample!",
"Hi,good morning.",
"Hello world"
};
char s[80];
strcpy(s,str[0]);//也可写成strcpy(s,*str);
strcpy(s,str[1]);//也可写成strcpy(s,*(str+1));
strcpy(s,str[2]);//也可写成strcpy(s,*(str+2));
上例中,str是一个三单元的数组,该数组的每个单元都是一个指针,这些指针各指向一个字符串。把指针数组名str当作一个指针的话,它指向数组的第0号单元,它的类型是char**,它指向的类型是char *。
*str也是一个指针,它的类型是char*,它所指向的类型是char,它指向的地址是字符串"Hello,this is a sample!"的第一个字符的地址,即'H'的地址。
str+1也是一个指针,它指向数组的第1号单元,它的类型是char**,它指向的类型是char *。
*(str+1)也是一个指针,它的类型是char*,它所指向的类型是char,它指向"Hi,good morning."的第一个字符'H',等等。
下面总结一下数组的数组名的问题。声明了一个数组TYPE array[n],则数组名称array就有了两重含义:第一,它代表整个数组,它的类型是TYPE [n];第二,它是一个指针,该指针的类型是TYPE*,该指针指向的类型是TYPE,也就是数组单元的类型,该指针指向的内存区就是数组第0号单元,该指针自己占有单独的内存区,注意它和数组第0号单元占据的内存区是不同的。该指针的值是不能修改的,即类似array++的表达式是错误的。
在不同的表达式中数组名array可以扮演不同的角色。
在表达式sizeof(array)中,数组名array代表数组本身,故这时sizeof函数测出的是整个数组的大小。
在表达式*array中,array扮演的是指针,因此这个表达式的结果就是数组第0号单元的值。sizeof (*array)测出的是数组单元的大小。
表达式array+n(其中n=0,1,2,....。)中,array扮演的是指针,故array+n的结果是一个指针,它的类型是TYPE*,它指向的类型是TYPE,它指向数组第n号单元。故sizeof(array+n)测出的是指针类型的大小。
例十:
int array[10];
int (*ptr)[10];
ptr=&array;
上例中ptr是一个指针,它的类型是int (*)[10],他指向的类型是int [10],我们用整个数组的首地址来初始化它。在语句ptr=&array中,array代表数组本身。
本节中提到了函数sizeof(),那么我来问一问,sizeof(指针名称)测出的究竟是指针自身类型的大小呢还是指针所指向的类型的大小?答案是前者,例如:
int (*ptr)[10];
则在32位程序中,有:
sizeof(int(*)[10])==4
sizeof(int [10])==40
sizeof(ptr)==4
实际上,sizeof(对象)测出的都是对象自身的类型的大小,而不是别的什么类型的大小。
如果对声明数组的语句不太明白的话,请参阅<<如何理解c和c++的复杂类型声明>>, 数组的数组名其实可以看作一个指针,看下例:
例八:
int array[10]={0,1,2,3,4,5,6,7,8,9},value;
...
...
value=array[0];//也可写成:value=*array;
value=array[3];//也可写成:value=*(array+3);
value=array[4];//也可写成:value=*(array+4);
上例中,一般而言数组名array代表数组本身,类型是int [10],但如果把array看做指针的话,它指向数组的第0个单元,类型是int *,所指向的类型是数组单元的类型即int。因此*array等于0就一点也不奇怪了。同理,array+3是一个指向数组第3个单元的指针,所以*(array+3)等于3。其它依此类推。
例九:
char *str[3]={
"Hello,this is a sample!",
"Hi,good morning.",
"Hello world"
};
char s[80];
strcpy(s,str[0]);//也可写成strcpy(s,*str);
strcpy(s,str[1]);//也可写成strcpy(s,*(str+1));
strcpy(s,str[2]);//也可写成strcpy(s,*(str+2));
上例中,str是一个三单元的数组,该数组的每个单元都是一个指针,这些指针各指向一个字符串。把指针数组名str当作一个指针的话,它指向数组的第0号单元,它的类型是char**,它指向的类型是char *。
*str也是一个指针,它的类型是char*,它所指向的类型是char,它指向的地址是字符串"Hello,this is a sample!"的第一个字符的地址,即'H'的地址。
str+1也是一个指针,它指向数组的第1号单元,它的类型是char**,它指向的类型是char *。
*(str+1)也是一个指针,它的类型是char*,它所指向的类型是char,它指向"Hi,good morning."的第一个字符'H',等等。
下面总结一下数组的数组名的问题。声明了一个数组TYPE array[n],则数组名称array就有了两重含义:第一,它代表整个数组,它的类型是TYPE [n];第二,它是一个指针,该指针的类型是TYPE*,该指针指向的类型是TYPE,也就是数组单元的类型,该指针指向的内存区就是数组第0号单元,该指针自己占有单独的内存区,注意它和数组第0号单元占据的内存区是不同的。该指针的值是不能修改的,即类似array++的表达式是错误的。
在不同的表达式中数组名array可以扮演不同的角色。
在表达式sizeof(array)中,数组名array代表数组本身,故这时sizeof函数测出的是整个数组的大小。
在表达式*array中,array扮演的是指针,因此这个表达式的结果就是数组第0号单元的值。sizeof (*array)测出的是数组单元的大小。
表达式array+n(其中n=0,1,2,....。)中,array扮演的是指针,故array+n的结果是一个指针,它的类型是TYPE*,它指向的类型是TYPE,它指向数组第n号单元。故sizeof(array+n)测出的是指针类型的大小。
例十:
int array[10];
int (*ptr)[10];
ptr=&array;
上例中ptr是一个指针,它的类型是int (*)[10],他指向的类型是int [10],我们用整个数组的首地址来初始化它。在语句ptr=&array中,array代表数组本身。
本节中提到了函数sizeof(),那么我来问一问,sizeof(指针名称)测出的究竟是指针自身类型的大小呢还是指针所指向的类型的大小?答案是前者,例如:
int (*ptr)[10];
则在32位程序中,有:
sizeof(int(*)[10])==4
sizeof(int [10])==40
sizeof(ptr)==4
实际上,sizeof(对象)测出的都是对象自身的类型的大小,而不是别的什么类型的大小。
展开全部
在一维数组中,S[i]表示数组元素,单一个S表示数组名,也是数组首地址(即S[0]的地址)
在二维数组中,S[i]表示“组”的首地址(我实在不知怎么解释),比如有一个二维数组
     S[i][0] S[i][1] S[i][2]
S[0]    1       2       3
S[1]    4       5       6
S[2]    7       8       9
这里面,S[0]也就是第一行的首地址(同时也是整个二维数组的首地址,即元素1的地址),S[1]是第二行首地址(元素4的地址),S[2]是第三行首地址(元素7的地址)。
S[i][0]这一类是元素不是地址。
在二维数组中,S[i]表示“组”的首地址(我实在不知怎么解释),比如有一个二维数组
     S[i][0] S[i][1] S[i][2]
S[0]    1       2       3
S[1]    4       5       6
S[2]    7       8       9
这里面,S[0]也就是第一行的首地址(同时也是整个二维数组的首地址,即元素1的地址),S[1]是第二行首地址(元素4的地址),S[2]是第三行首地址(元素7的地址)。
S[i][0]这一类是元素不是地址。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
首先你得先搞懂*这个符号的意思,解引用符号,比如指针指向一个整型数据a,int* p = a;这是定义,而对于引用a的值的时候就必须用解引用符号*p,p是a的地址。
现在来看一下它和一维数组的关系
int a[10];这定义了一个十个整形元素的数组,a就是它的首地址,等价于&a[0],a+1即a[1].
int* p; p = a 定义一个指针指向p,由于前面讲的a已经是地址,所以就不必在a前再加&.这样的话,对于解引用操作*p就是a[0]了 *(p+1)就是a[1]了.
再来看二维数组:
int a[10][10];
int* p = a;
这里的a仍然表示地址 , 与一维数组不同的是他表示的是a[0][0],这样一来,你可以自己推一下*(p+1)表示什么……
它表示p[1][0]的地址而不是它的值! 因为它是二维数组,用一个解引用符号仍然表示二维数组高维的首地址.那要引用到具体数组中的元素应该怎么办呢?用两个解引用操作符:
*(*(p+1)+1) 表示什么?
它表示p[1][1]
这就是指针和数组的关系
现在来看一下它和一维数组的关系
int a[10];这定义了一个十个整形元素的数组,a就是它的首地址,等价于&a[0],a+1即a[1].
int* p; p = a 定义一个指针指向p,由于前面讲的a已经是地址,所以就不必在a前再加&.这样的话,对于解引用操作*p就是a[0]了 *(p+1)就是a[1]了.
再来看二维数组:
int a[10][10];
int* p = a;
这里的a仍然表示地址 , 与一维数组不同的是他表示的是a[0][0],这样一来,你可以自己推一下*(p+1)表示什么……
它表示p[1][0]的地址而不是它的值! 因为它是二维数组,用一个解引用符号仍然表示二维数组高维的首地址.那要引用到具体数组中的元素应该怎么办呢?用两个解引用操作符:
*(*(p+1)+1) 表示什么?
它表示p[1][1]
这就是指针和数组的关系
参考资料: C++ PRIMER & 自己
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
一维数组a[10]:a表示数组首地址,数组第一个值可以表示为*a,a[0]
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询