【C语言笔记】指针和一维数组问题讨论
本帖最后由 SupKevin 于 2017-4-4 17:16 编辑指针和一维数组
温习了一下以前的知识,对于数组a 来说,&a 和阿a 是等价的,也就是说a保存的是a的地址。即 &a==a.//一维数组名是个指针常量,例如:int a【3】,int b【4】
a = b ;这时就便是错误的,因为a是常量,是不能把一个值来赋值给一个常量的。
看下面的一个例子:
如果在指针和一维数组中,如果想通过一个函数来输出一个数组的内容;函数要用两个参数才可以实现。
#include <stdio.h>
int main(void)
{
void f(int * pArr, int len);
int a = {1,2,3,4};
int b = {5,6,7,7,8};
int c = {1,2};
f(a,4);
f(b,5);
f(c,6);
return0;
}
void f(int * pArr, int len)
{
int i;
for(i = 0;i < len; i++)
{
printf("%d",*(pArr+i));
}
printf("\n");
}
void f(int * pArr, int len);//定义指针变量 ,所说的需要两个参数,一个参数就是数组元素的首位元素a【0】,但是仅仅是知道数组元素的首元素还是不够的 ,还必须知道数组的长度,不然无法实现此函数的功。
因为在数组a中a代表的是a【0】元素的地址,所以在函数调用的时候格式为 f(a,4)
‘4’代表的是数组的长度!
*(pArr+i)等价于pArr【i】也等价于a【i】也等价于*(a+i)
也就是说上个例子中 printf("%d ",*(pArr+i));中的*(pArr+i)可以被替换。此时就和数组的编号扯上了点关系;
*p(Parr)==a【0】//此时i=0;也就是说 parr = a =&a【0】
*p(parr+1)== a【1】
依次来推出:
*(pArr+i)等价于pArr【i】也等价于a【i】也等价于*(a+i)
应用:
此时我们就可以通过函数来改变数组中的任意一个元素的值;
2017/3/12
指针的运算
如果两个指针变量指向的是同一块连续空间的不同储存单元,则这两个指针变量才可以相减,数组便是其中的一种
例如:
Int a;
Int * p;
Int * q
P = &a【1】
Q = &a【4】
printf(“则p,q相隔了%d个单元”);//输出结果是相差了3个单元。
支持一下楼主 证明辛苦
个人觉得a和&a虽然在数值上是相等,但是不是同一个东西,他们指向的内存大小不一样。不知道对不对。
支持一下楼主 证明辛苦 本帖最后由 懒惰的魔方 于 2017-3-16 14:27 编辑
明知o故犯 发表于 2017-3-15 18:04
个人觉得a和&a虽然在数值上是相等,但是不是同一个东西,他们指向的内存大小不一样。不知道对不对。
比如有如下代码
int a={2};
int b;
void main(){
b=(a==&a)?1:0;
return;
}
编译后会在bs段和cs段分别保存b和a
而a 和 &a 均表示a在bs段的偏移地址。
至于a与&a怎么写,都是给编译器看的。实质产生结果是一样的。
看下面代码:
mov eax, OFFSET a
xor ecx, ecx
cmp eax, OFFSET a
sete cl
mov DWORD PTR b, ecx 顶一下。。。。
页:
[1]