您的位置:首页 > 编程语言 > C语言/C++

C语言之指针和数组 1

2015-10-22 00:57 323 查看
1、指针和地址

    指针变量是一个包含地址的存储集合,通常32位系统的指针变量是4个字节,64位系统的指针变量是8个字节。

    &为取址操作符,只能用于内存中的变量和数组元素对象上,不能被应用在表达式、常量和寄存器变量上。

    *为一元操作符,作用是间接寻址和间接引用。对指针变量的声明性定义如下:

    int *p;

    这样声明的意义是有帮助记忆的功能,说明*p是一个int类型的变量。

    每一个指针都指向一个明确的数据类型。

    ++*ip和(*ip)++:像*和++的一元操作符,操作顺序是从右至左,所以第二个表达式必须要加(),否则指向的就是后一个对象的值。

    ip = iq;当ip和iq指向的对象数据类型一致时,ip将指向iq所指向的对象;当类型不一致时,会警告,但不报错,引用时会出现非想要的结果。例如:

#include <stdio.h>

/*

    test the allocation of integer data

*/

int main()

{

    int a = 0x343333231;

    char *p = &a;

    printf("%x\n", *p);

    return 0;

}

整型变量a存放在内存中的情况如下图:



存储int型的数据时,是按照从高地址存放高数据位,低地址存放低数据的方式安排数据,int类型变量a的指针仍指向的是低地址位,当将变量a的地址赋值给char类型的指针p时,那么*p引用的是0x31,即字符‘1’。指针变量中存放的是指向变量的地址,在编译成汇编代码时已将所指向数据的类型包含进去。

2、指针和函数参数

函数调用时,若采用值传递的方式,则原函数中的参数值不会改变;若采用地址传递的方式,则原函数中的参数值则可以改变。Pointer arguments enable a function to access and change objects
in the function that called it. ---- 指针参数使得函数可以获取并改变原函数中的对象值。

3、指针和数组

当pa指针变量指向一个数组中特定的一个元素时,pa + i则指向pa后的第i个元素,pa - i指向pa前的第i个元素(在不超出范围的情况下),不论数组中元素的类型是什么,都成立。

相同的表示:

a[i]/*(a + i), &a[i]/a + i, pa[i]/*(pa + i)

指针变量是变量,数组名不是变量,而是常量。

对于函数的形参,如f(int arr[])和f(int *arr)我们更倾向于使用第二种表示方法,首先,它非常明确的表示传入的是一个指针变量,其次,在使用的过程中既可以用于数组中,也可以用于非数组中。

4、地址算运

在数组中,p++指向下一个元素,p + i指向p后第i个元素。

指针变量的初始化:虽然可以和其他变量一样赋值,但是只有0和包含先前定义的有合适类型数据的地址有意义。

在C语言中,0是一个非法的数据地址,所以可以用返回0值表示一个异常事件。指针和整数是不可以互相交换的,0是一个特殊情况,常量0可以被赋值给指针,而且指针可以和常量0进行比较,符号常量NULL通常被用来替代0,作为一个助记符更加清晰地表明对于指针来说是一个特殊值。

指针运算有几个非常重要的方面:

1、在特定情况下,指针之间可以进行比较,例如当p和q指向同一个数组中的成员时,可以用==, !=, <, >=等。所有指针都可以和0进行相等和不相等的比较,不同数组中的地址不可以进行比较。 

2、指针可以和整数进行加减法,p + n,指向p后的第n个元素,不管p指向的是何种类型,第n个元素的类型与p相同。指针的减法也是合法的,当p和q指向同一个数组里的元素时,当q > p,q - p + 1可以用来计算字符串的长度。

所有指针的操作都会自动考虑指针所指向的对象的类型尺寸。

合法的指针操作:

1、相同类型指针间的赋值;

2、指针和整数的加减;

3、两个指向同一数组中不同成员的指针的相减和比较;

4、指针被赋0值或和0相比较。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 编程 指针 数组