C语言指针详解之一
Posted 骅懿嵌入式
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言指针详解之一相关的知识,希望对你有一定的参考价值。
C语言指针详解之一
一、指针概念
1.指针的类型
将指针声明语句里的指针名字去掉,剩下的部分就是这个指针的
类型。
int* p; /* 指针的类型是int* */
short* p; /* 指针的类型是short* */
char* p; /* 指针的类型是char* */
int** p; /* 指针的类型是int** */
int(*p)[3]; /* 指针的类型是int(*)[3] */
int*(*p)[3]; /* 指针的类型是int*(*)[3] */
2.指针所指向的类型
将指针声明语句里的指针名字和名字左边的指针声明符*去掉,剩
下的就是指针所指向的类型。通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将那片内存区里的内容当做什么来看待。
int* p; /* 指针所指向的类型是int */
short* p; /* 指针所指向的类型是short */
char* p; /* 指针所指向的类型是char */
int** p; /* 指针所指向的类型是int* */
int(*p)[3]; /* 指针所指向的类型是int()[3] */
int*(*p)[3]; /* 指针所指向的类型是int*()[3] */
3.指针的值
4.指针本身所占据的内存区
指针本身占据多大内存?只需要用函数sizeof(指针的类型)测一下就知道了,在32为处理器里,指针本身占据4个字节的长度。
二、指针的算术运算
指针可以加上或减去一个整数。
例子一:
#include
#include
int main(void)
{
char au8T_Buff[10]={0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,
0x99};
int* pu32T_Pointer;
printf("指针pu32T_Pointer本身占据的内存为:%d个字节\n",sizeof(int*));
printf("\n");
printf("\n");
pu32T_Pointer = au8T_Buff;
printf("\n");
printf("指针指向的数值为:%#X\n",*pu32T_Pointer);
printf("\n");
pu32T_Pointer++;
printf("\n");
printf("指针指向的数值为:%#X\n",*pu32T_Pointer);
getchar();
return 0;
}
运行结果如下:
例子二:利用指针遍历数组
#include
#include
int main(void)
{
int au8T_Buff[10]= {0x00U,0x11U,0x22U,0x33U,0x44U,0x55U,0x66U,0x77U,
0x88U,0x99U};
int* pu32T_Pointer;
char u8T_i = 0U;
pu32T_Pointer = au8T_Buff;
for(u8T_i = 0U; u8T_i < 10; u8T_i++)
{
printf("数组au8T_Buff的值为: %#X\n",au8T_Buff[u8T_i]);
printf("\n");
(*pu32T_Pointer)++; /*数组中的值加1*/
printf("数组au8T_Buff的值为: %#X\n",au8T_Buff[u8T_i]);
printf("\n");
printf("指针pu32T_Pointer的值为: %#X\n",pu32T_Pointer);
printf("指针pu32T_Pointer的值为: %#X\n",pu32T_Pointer);
printf("\n");
}
getchar();
return 0;
}
运行结果如下:
例子三:
#include
#include
int main(void)
{
char au8T_Buff[10]={0x00U,0x11U,0x22U,0x33U,0x44U,0x55U,0x66U,
0x77U,0x88U,0x99U};
int* pu32T_Pointer;
printf("指针pu32T_Pointer的值为: %#X\n",pu32T_Pointer);
printf("\n");
printf("指针pu32T_Pointer所指向的内存区数据为: %#X\n",*pu32T_Pointer);
printf("\n");
pu32T_Pointer+=5;
printf("指针pu32T_Pointer的值为: %#X\n",pu32T_Pointer);
printf("指针pu32T_Pointer所指向的内存区数据为: %#X\n",*pu32T_Pointer);
getchar();
return 0;
}
程序运行结果如下:
总结下本章内容:
第三章运算符&和*
*间接运算符,当已具有一个指针,并且希望获取它所引用的对象时,使用间接运算符*,它的操作数必须是指针类型。如果ptr是指针,那么*ptr就是ptr所指向的对象或函数。如果ptr是一个对象指针,那么*ptr就是一个左值,可以把它(即*ptr)当作赋值运算符左边的操作数。
例子四:
#include
#include
int main(void)
{
int u32T_Test = 0x99U;
int* pu32T_Pointer = NULL;
int** ppu32T_Pointer = NULL;
printf("\n");
/*&u32T_Test的结果是一个指针,类型是int*,指向的类型是int,
pu32T_Pointer = &u32T_Test;
printf("\n");
就是变量u32T_Test*/
*pu32T_Pointer = 0xAAU;
printf("变量u32T_Test的值为:%#X\n",u32T_Test);
printf("\n");
ppu32T_Pointer = &pu32T_Pointer;
printf("\n");
getchar();
return 0;
}
上面程序运行结果如下:
以上是关于C语言指针详解之一的主要内容,如果未能解决你的问题,请参考以下文章