吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3153|回复: 5
收起左侧

[C&C++ 转载] 【C语言笔记】指针和一维数组问题讨论

  [复制链接]
SupKevin 发表于 2017-3-15 16:35
本帖最后由 SupKevin 于 2017-4-4 17:16 编辑

指针和一维数组
       温习了一下以前的知识,对于数组a[5] 来说,&a[0] 和阿a 是等价的,也就是说a保存的是a[0]的地址。即 &a[0]==a.//一维数组名是个指针常量,例如:int a【3】,int b【4】
                                                            a = b ;这时就便是错误的,因为a是常量,是不能把一个值来赋值给一个常量的。
看下面的一个例子:
如果在指针和一维数组中,如果想通过一个函数来输出一个数组的内容;函数要用两个参数才可以实现。
         #include <stdio.h>

int main(void)
{
         void f(int * pArr, int len);
         int a[4] = {1,2,3,4};
         int b[5] = {5,6,7,7,8};
         int c[6] = {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)等价于pArri】也等价于ai】也等价于*a+i
也就是说上个例子中 printf("%d ",*(pArr+i));中的*(pArr+i)可以被替换。此时就和数组的编号扯上了点关系;
*p(Parr)==a【0】//此时i=0;也就是说 parr = a =&a0
*p(parr+1)== a【1】
依次来推出:
*pArr+i)等价于pArri】也等价于ai】也等价于*a+i
应用:
   此时我们就可以通过函数来改变数组中的任意一个元素的值;
     
2017/3/12
         指针的运算
如果两个指针变量指向的是同一块连续空间的不同储存单元,则这两个指针变量才可以相减,数组便是其中的一种
   例如:
Int a[10];
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[0]虽然在数值上是相等,但是不是同一个东西,他们指向的内存大小不一样。不知道对不对。
平淡哥 发表于 2017-3-16 11:25
懒惰的魔方 发表于 2017-3-16 14:26
本帖最后由 懒惰的魔方 于 2017-3-16 14:27 编辑
明知o故犯 发表于 2017-3-15 18:04
个人觉得a和&a[0]虽然在数值上是相等,但是不是同一个东西,他们指向的内存大小不一样。不知道对不对。

比如有如下代码
[C++] 纯文本查看 复制代码
int a[1]={2};
int b;
void main(){
        b=(a==&a[0])?1:0;
        return;
}

编译后会在bs段和cs段分别保存b和a
而a 和 &a[0] 均表示a在bs段的偏移地址。
至于a与&a[0]怎么写,都是给编译器看的。实质产生结果是一样的。
看下面代码:
[Asm] 纯文本查看 复制代码
        mov        eax, OFFSET a
        xor        ecx, ecx
        cmp        eax, OFFSET a
        sete        cl
        mov        DWORD PTR b, ecx     
刘串 发表于 2017-3-16 15:58
顶一下。。。。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 04:23

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表