指针

#include <stdio.h>

/* 
指针:本质是一个变量,用于存储另一个变量(比如变量b)的内存地址, 
既然是变量,就有值,其值就是变量b的内存地址,
我们知道,可以使用连字号&来获取一个变量的内存地址,比如&b表示变量b的内存地址
而使用星号*指针的形式可以获取变量b的值,如下实例所示:
*/
int main()
{
	int a = 10;		// 声明一个变量
	int *ip;		// 声明一个指针
    
	ip = &a;		// 使用指针ip来存储变量a的内存地址

	printf("变量a的内存地址是:%p \n", &a);			// 变量a的内存地址
	printf("指针ip的值是:%p \n", ip);				// 指针ip的值
	printf("通过指针获取变量a的值:%d \n", *ip);	// 通过指针获取变量的值

	printf("指针ip的内存地址:%p \n", &ip);			// 获取指针的内存地址

	// 结束main函数
	return 0;
}

 

 

指针可以进行算术运算:

/* 使用指针存储数组的内存地址,并使用指针表示数组的值 */
#include <stdio.h>

const int MAX = 3;

int main()
{
	int dat[] = {10, 20, 30};
	int i, *ptr;
    // 这里直接把数组名赋值给指针ptr,也即数组的第一个元素的地址赋值给指针的意思,没写就默认是数组的第一个元素的地址
	ptr = dat;  // 或者:ptr = &dat[ 0 ]; 表示指针指向数组的第一个元素的内存地址

	for(i=0; i<MAX; i++)
	{
		printf("存储地址:\t dat[ %d ] = %x \n", i, ptr);
		printf("存储值:\t dat[ %d ] = %d \n", i, *ptr);
         /* 移动到下一个位置 */
		ptr++;
	}

	// 结束main函数
	return 0;
}

 

 另一种方法:

/* 使用指针存储数组的内存地址,并使用指针表示数组的值 */
#include <stdio.h>

const int MAX = 3;

int main()
{
	int dat[] = {10, 20, 30};
	int i, *ptr;

	ptr = &dat[ MAX - 1 ];

	for(i=MAX; i>0; i--)
	{
		printf("存储地址:\t dat[ %d ] = %x \n", i-1, ptr);
		printf("存储值:\t dat[ %d ] = %d \n", i-1, *ptr);

		ptr--;
	}

	// 结束main函数
	return 0;
}

 

 十六进制数28ff34转十进制数是:2686764

 十六进制数28ff30转十进制数是:2686768

 十六进制数28ff2c转十进制数是:2686772

所以,指针每递增一次,就+4,同一个数组中的元素的内存地址是连续分配的,中间不会被其他元素地址隔开,所以通过自增或自减就可以获取数组中所有元素的地址

 

posted @ 2018-02-19 18:47  半生戎马,共话桑麻、  阅读(112)  评论(0)    收藏  举报
levels of contents