数组和指针

例子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;   //编译不通过,因为在表达式中数组是当做常量指针,所以不能改变指向。 
}

 

posted @ 2016-09-07 21:56  hana12169  阅读(106)  评论(0编辑  收藏  举报