看到的不错的帖子,共享一下
1.指针说明
指针是包含另一变量的地址变量。
(1)int *p
p是一个指针,指向一个整形数。
(2)int *p()
p是一个函数,该函数返回一个指向整数的指针。
(3)int (*p)()
p是一个指针,该指针指向一个函数,这个函数返回一个整数。
(4)int *p[]
p是一个数组,该数组的每一个元素是指向整数的指针。
(5)int (*p)[]
p是一个指针,该指针指向一个数组,这个数组的每一个元素是一个整数。
(6)int *(*p)()
p是一个指针,该指针指向一个函数,这个函数返回一个指向整数的指针。
2.指针的初始化(赋地址)
(1)通过符号&取变量(包括结构变量、数组第一个元素)的地址赋给指针;
(2)把数组名赋给指针;
(3)把函数名赋给指向函数的指针;
(4)动态分配内存
例:struct c{double r,i;};
struct c *p;
p=(struct c *)malloc(sizeof(struct c));
3.指针与数组、函数的关系
(1)对于一维数组 int a[i] 或指针 int *a
a+i 指向 a[i]
(2)对于字符串 char s[i] 或指针 char *s
s+i 指向第 i个字符 s[i]
(3)对于二维数组int a[i][j]
*a+j 指向 a[0][j]
*(a+i) 指向 a[i][0]
*(a+i)+j 指向 a[i][j]
例:对于 a[2][3]={1,2,3,4,5,6,}; 有 *(*(a+1)+1)=5;
(4)对于字符串数组char p[i][j] 或字符型指针数组char *p[i]
*p+j 指向第 0个字符串的第 j个字符
*(p+i) 指向第 i个字符串的第 0个字符
*(p+i)+j 指向第 i个字符串的第 j个字符
例:对于 *p[]={"ABC","DEF"}; 有 *(*(p+1)+1)='E';
例:对于 char p[][3]={"ABC","DEF"}; 有 *(*(p+1)+1)='E';
(5)对于指针数组int *a[i]
a[i] 指向 变量i
即 *a[i]=变量i 或 a[i]=&变量i
(6)对于结构struct XY
{int x;int *y}*p;
p是指向结构XY的指针
(*p).x 或 p->x 是表示 x 的内容
(*p).y 或 p->y 是表示指针 y 的值(地址)
*(*p).y 或 *p->y 是表示 y 所指的内容
&(*p).x 或 &p->x 是表示 x 的地址
(7)指向函数的指针
对于 void func(char *str)
{…}; //定义了一个函数
void (*p)(char*);//定义了一个函数指针
p=func; //让指针指向函数
则(*p)("…"); //用指针p可以调用函数func
(8)指向多个不同函数的指针数组
对于void function_1() {…};
…
void function_4() {…}; //定义了四个函数
typedef void(*menu_fcn)();//定义了指向函数的指针
menu_fcn command[4]; //定义了指针数组
command[0]=function_1;
…
command[3]=function_4; //让指针数组指向四个函数
则command[0](); //用指针数组中的一个元素调用一个函数
4.指针的分类
(1)近指针(near):
近指针为16位指针,它只含有地址的偏移量部分。近指针用于不超过64K 字节的单个数据段或代码段。在微、小和中编译模式下产生的数据指针是近指针(缺省状态);在微、小和中编译模式下产生的码指针(指向函数的指针)是近指针(缺省状态)。
(2)远指针(far)
远指针为32位指针,指针的段地址和偏移量都在指针内。可用于任意编译模式。每次使用远指针时都要重装段寄存器。远指针可寻址的目标不能超过64K ,因为远指针增减运算时,段地址不参与运算。在紧凑、大和巨模式下编译产生的数据指针是远指针(缺省状态)。
(3)巨指针(huge)
巨指针为32位指针,指针的段地址和偏移量都在指针内。可用于任意编译模式。远指针寻址的目标可以超过64K 。巨指针是规则化的指针。
5.指针的转换
(1)远指针转换成巨指针
使用以下函数
void normalize(void far * * p)
{
*p=(void far *)(((long)*p&0xffff000f)+(((long)*p&0x0000fff00<<12));
}
6.指针的使用
(1)将浮点数转换成二进制数
float ff=16.5;
unsigned char *cc;
(float*)cc=&ff;
//此时cc的内容为"00008441"
//即cc第一个字节=0;第二个字节=0;第三个字节=0x84;第四个字节=0x41;
(2)将二进制数转换成浮点数
float ff;
unsigned char *cc;
cc=(unsigned char*)malloc(4);
cc=(unsigned char*)&ff;
*(cc+0)=0;
*(cc+1)=0;
*(cc+2)=0x84;
*(cc+3)=0x41;
//此时ff=16.5
free(cc);
共2条
1/1 1 跳转至页
C语言基本概念之指针(zz)
关键词: 语言 基本 念之 指针 一个 指向 函数 数组 对
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
vscode+cmake搭建雅特力AT32L021开发环境被打赏30分 | |
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 |