ANSI C (6) —— 指针、断言、信号、跳转

本文详细介绍了C语言中的指针,包括声明、数组和指针的关系、多级间接访问以及const指针和指向函数的指针。此外,还探讨了断言的使用和信号处理机制,以及在程序中如何实现非寻常的跳转操作。通过实例解析了restrict关键字的用途,同时也讨论了C语言中的块和局部变量以及char类型的负数问题。
摘要由CSDN通过智能技术生成

指针

指针的声明

下面的三条语句是等价的,但是我们常常使用的是第一种形式int *p,同时我们注意,他们是在初始化p而不是*p。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a=12;
    int *p1=&a;   
    int* p2=&a;
    int * p3=&a;
    printf("p1: %p %d\n",p1,*p1);
    printf("p2: %p %d\n",p2,*p2);
    printf("p3: %p %d\n",p3,*p3);
    return 0;
}
/*
p1: 0028FF10 12
p2: 0028FF10 12
p3: 0028FF10 12
*/

指向void 类型的指针可以指向其他的任何的数据类型变量的地址。任何类型的指针也可以指向void.
这里写图片描述

int main()
{
    int a=12;
    double b=12.99;
    void *p=&a;
    printf("%d\n",*((int *)p));
    p=&b;
    printf("%lf\n",*((double *)p));
    return 0;
}
/*
12
12.990000
*/

我们可以在变量value前使用&但是不能在value ‘计算符’ ‘常量或变量’前加&,因为value ‘计算符’ ‘常量或变量’得到的是常量

    int a=12,b=10;
    int *p=&(a+b);  // error: lvalue required as unary '&' operand

数组和指针

数组名是一个指针常量,数组定义时设置成数组第一个单元的地址,从此以后就不能修改,int a[3]; a=...是错误的。
但是修改数组的单元是合法的,a[1]=...
指针变量可以进行赋值操作。

#include <stdio.h>
int main(){    
    char *p=NULL;    
    char s[10]="123456789";    
    p=s;    
    printf("%s\n",p);    
    p=s+2;  /*  等价于 p=&s[2];  [2]表示和数组首地址的偏移量是2 */    
    printf("%s\n",p);    
  p=s+4; /*  等价于p=&s[4];    [4]表示和数组首地址的偏移量是4 */    
  printf("%s\n",p);    
  return 0;
}
/*123456789345678956789*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值