• 数组和指针


    例子1:

    char a[10] = “hello”; //数组a的定义+初始化。数组的定义在栈上开辟一个10个byte的空间,空间里用“hello”来填充。
    char *p = a; //定义 char 指针p指向a在栈里的地址。
    

     例子2:

    char a[10]; //定义char 数组,在栈上开辟10个byte的空间。
    a = "hello";//在表达式中数组当做指针来处理,但因该是当做常量指针,既指针的指向不能发生变化。
           //所以在此处意思是在常量区开辟一个空间填充为“hello”,然后将a的地址指向该常量空间的地址,常量指针的指向是不能改变的,所以错误。
    *a = 'f'; //这样是可以的,因为在表达式中,数组是当做指向数组首地址的指针来处理的,所以此处可以通过编译。

    例子3:

    char a[10];
    char *p = "hello";
    memcpy(&a, p, strlen(p)); //用memcpy来对已经声明的数组赋值。

    例子4:

    file1:
    extern char *p;  //声明
    file2:
    char p[10] //定义

    指针是间接寻址,数组是直接寻址,既指针只是一个存储有指向要访问对象的地址的地址,而数组是直接存储的数组的地址。
    既char p[10]会在符号表里面记录p的地址比如说是0x8000,则访问该数组的第i个元素时,访问的是0x800i地址存储的内容,

    char *p 会记录指针p的地址,比如说是0x4000,0x4000存储的是地址0x8000,则访问第i个元素时可以用p=+i;,然后p指向0x800i。

    例子5:

    int arr1[10];
    int arr2[10];
    
    fun1(int arr [])   //在函数传递中,数组默认当做指向数组首地址的变量指针来传递,所以这个指针的指向可以改变。
    {
        arr[1] = 3;
        *arr = 2;
        arr = arr1;          
    }
    
    fun2(int *arr)
    {
        arr[1] = 3;
        *arr = 2;
        arr = arr2;
    }
    
    int main ()
    {
        arr1 = arr2;   //编译不通过,因为在表达式中数组是当做常量指针,所以不能改变指向。 
    }
  • 相关阅读:
    坚持的力量 第一篇
    有声似无声
    坚持的力量
    新浪技术面试题
    单词的个数
    我的研究生规划
    go to the train station
    百度面试题求绝对值最小的数
    关于CIW认证考试CIW 常见问题解答
    [恢]hdu 2087
  • 原文地址:https://www.cnblogs.com/hana12169/p/5851243.html
Copyright © 2020-2023  润新知