C语言指针用法

一、指针说明

指针是包含另一变量的地址变量。

1、int *p

p是一个指针,指向整型数。

2、int *p()

p是一个函数,该函数返回一个指向整型的指针。

3、int (*p)()

p是一个指针,该指针指向一个函数,这个函数返回一个整数。

4、int *p[]

p是一个数组,该数组的每一个元素是指向整数的指针。

5、int (*p)[]

p是一个指针,该指针指向一个数组,这个数组的每一个元素是一个整数。

6、int *(*p)()

p是一个指针,该指针指向一个函数,这个函数返回一个指向整数的指针。

二、指针的初始化(赋地址)

1、通过符号&取变量(包括结构变量、数组第一个元素)的地址赋给指针;

2、把数组名赋给指针;

3、把函数名赋给指向函数的指针;

4、动态分配内存;

示例:

struct c {double r,i;};

struct c *p;

p=(struct c*)malloc(sizeof(struct c));

三、指针与数组、函数的关系

1、对于一维数组int a[]或指针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)+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 *p}*p;

p是指向结构XY的指针

(*p).x或p→x是表示x的内容

(*p).y或p→y是表示指针y的值(地址)

*(*p).y或p→y是表示y所指的内容

&(*p).x或&p→x是表示x的地址

四、指针的分类

1、近指针(near)

近指针为16位指针,它只含有地址的偏移量部分,近指针用于不超过64K字节的单个数据段或代码段。在微、小和中编译模式下产生的数据指针是近指针(缺省状态),在微、小和中编译模式下产生的码指针(指向函数的指针)是近指针(缺省状态)。

2、远指针(far)

远指针为32位指针,指针的段地址和偏移量都在指针内,可用于任意编译模式,每次使用远指针时都要重装段寄存器,远指针可寻址的目标不能超过64K,因为远指针增减运算时,段地址不参与运算,在紧凑、大和巨模式下编译产生的数据指针是远指针(缺省状态)。

3、巨指针(huge)

巨指针为32位指针,指针的段地址和偏移量都在指针内,可用于任意编译模式,远指针可寻址的目标可以超过64K,巨指针是规则化的指针。

五、指针的转换

1、远指针转换成巨指针

使用以下函数

void normalize(void far **p)

{

*p=(void far *)(((long)*p&0xffff000f)+(((long)*p&0x0000fff00<<12));

}

六、指针的使用

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);

  • 13
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中的指针是一个非常重要的概念,它是许多高级特性的基础,如动态内存分配和复杂数据结构。指针是一个变量,它存储了一个内存地址,这个地址指向另一个变量的存储位置。 下面是一些常见的指针用法: 1. 声明指针变量:指针变量的声明需要使用星号(*),例如: ``` int *ptr; char *str; ``` 2. 取地址运算符(&):取地址运算符可以返回一个变量的地址,如: ``` int num = 10; int *ptr = &num; ``` 这里ptr指向了变量num的地址。 3. 解引用运算符(*):解引用运算符可以返回一个指针所指向的变量的值,如: ``` int num = 10; int *ptr = &num; printf("%d\n", *ptr); // 输出10 ``` 4. 指针的算术运算:指针可以进行加减运算,如: ``` int arr[3] = {1, 2, 3}; int *ptr = &arr[0]; ptr++; // 指向arr[1] ptr--; // 指向arr[0] ``` 注意,指针运算的单位是指针类型所占用的字节数。 5. 指针和数组:数组名本身就是一个指针,它指向数组的第一个元素。可以通过指针来访问数组中的元素,如: ``` int arr[3] = {1, 2, 3}; int *ptr = &arr[0]; printf("%d\n", *(ptr+1)); // 输出2 ``` 6. 指针和函数:指针可以作为函数的参数和返回值,如: ``` void swap(int *a, int *b) { int temp = *a; *a = *b; *b = temp; } int main() { int num1 = 10, num2 = 20; swap(&num1, &num2); printf("%d %d\n", num1, num2); // 输出20 10 return 0; } ``` 这里swap函数接收两个指针参数,通过解引用运算符来交换它们所指向的变量的值。 以上是一些常见的指针用法,掌握好指针的使用可以让你更加灵活地处理数据和内存。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值