SupKevin 发表于 2017-3-15 16:35

【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个单元。

黑狼战神 发表于 2017-3-15 17:12

支持一下楼主 证明辛苦

明知o故犯 发表于 2017-3-15 18:04

个人觉得a和&a虽然在数值上是相等,但是不是同一个东西,他们指向的内存大小不一样。不知道对不对。

平淡哥 发表于 2017-3-16 11:25


支持一下楼主 证明辛苦

懒惰的魔方 发表于 2017-3-16 14:26

本帖最后由 懒惰的魔方 于 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   

刘串 发表于 2017-3-16 15:58

顶一下。。。。
页: [1]
查看完整版本: 【C语言笔记】指针和一维数组问题讨论