您的位置:首页 > 理论基础 > 数据结构算法

03-数据结构_预备知识-指针

2013-07-22 12:07 369 查看
1) 指针的重要性

指针是C语言的灵魂

2) 定义

A)地址:

内存单元的编号

从0开始的非负整数

范围: 0 ~ FFFFFFFFH(4G-1)

B)指针:

指针就是地址, 地址就是指针.(指针,地址,内存单元编号, 两两等价)

指针变量: 存放 地址(内存单元编号) 的变量

3) 分类

A) 基本类型指针 -> int * p;

int i = 5;

int * p; // 指针变量; p, 变量名; 类型, int *, 存放int型变量 的地址;

p = &i; // 将 int型变量 i 的地址赋值给 指针变量.

printf("%d\n", *p); // *p, 以 p的内容 作为地址的 int型变量.

B) 指针和数组的关系

①03-pointer_2.c

#include <stdio.h>

int main(void) 
{
	// 数组名: a
	// a: 地址常量, 存放数组a的地址, 第一个元素的地址.
	int a[5] = {1, 2, 3, 4, 5};
	
	printf("%d \n", a[3]);
	printf("%d \n", *(a+3));
	printf("%d \n", 3[a]);	// 3, 偏移量
	
	printf("%p \n", a+1);	// 0022FF00
	printf("%p \n", a+2);	// 0022FF04
	printf("%p \n", a+3);	// 0022FF08

	return 0;
}


②03-pointer_3.c

#include <stdio.h>

void showArray(int * pArr, int len)
{
	int i;
	for (i = 0; i < len; ++i)
	{
		printf("%d \n", pArr[i]);// pArr[i] <=> *(pArr+i)
	}
	return;
}
// 确定一个数组: 首地址(数组名), 长度(元素的个数)
int main(void)
{
	int a[5] = {1, 2, 3, 4, 5};

	showArray(a, 5);// a <=> &a[0], &a[0]的类型为 int *

	return 0;
}


③03-pointer_4.c

#include <stdio.h>
/*
指针变量的运算
1, 指针变量之间不能 加/乘/除 
2, 如果两指针变量属于同一数组, 则可以 相减
3, 指针变量可以加减以整数
    int a[5] = {1}; //假设:a的值为 1000H
    int * p = a;    // p的值为 1000H, p指向的变量占4个字节 
    
	p+i == 1000H + i * 4 
	p-i == 1000H - i * 4
	++p , p++   <=>     p = p+1
	--p , p--   <=>	    p = p-1
	*/
int main(void)
{
    int a[5] = {0, 1, 2, 3, 4};		
    int * p = NULL;

    p = a;

    //int * q; int * r;   
    int * q, * r;   // 不能定义成 int * q, r;
    q = &a[1];  // = a + 1
    r = &a[4];  // = a + 4
    printf("%p\n", r);  // 0022FF00
    printf("%p\n", q);  // 0022FEF4
    printf("%d\n\n", (r - q) ); // 3

/*
    printf("%d\n", *(p++)); // 0
    printf("%d\n", *(p++)); // 1
    printf("%d\n", *(p--)); // 2 
*/  
    printf("%d\n", *p);     // 0
    printf("%d\n", *(++p)); // 1
    printf("%d\n", *(++p)); // 2
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: