C语言之指针和数组 1

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相比较。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值