杂记之C语言之指针(一)

//#用指针注意两点。1.初始化 2、空指针、野指针和void 型指针
/*不能出现野指针,可以出现空指针和void 型指针,空指针不能访问。
  void 型指针只有通过强制类型转换后才可以访问,否则也不能访问 */
#include<stdio.h>

int main(void){

 int i;
 int *pi=&i;//表示定义一个指向int型的变量指针pi,并用i的地址(为一常数)来初始化pi
 /*虽然pi的地址跟pc一样,但*pc只能访问一个字节,*pi可以访问到4个字节*/
 char c;
 char *pc=&c;
    /* 注意pi和pc最好不要相互赋值,或者通过强制类型转换pi=(int *)pc;这样做不可取,
    虽然pi的地址跟pc一样,但*pc只能访问一个字节,而*pi访问的是四个字节 */
 //如果写成pi=i就不行,因为i不是常量表达式。全局变量只能用常量表达式。
   
 //后面两行代码定义了一个字符型变量c和一个指向C的字符型指针pc,注意pi和pc虽然是不同
 //类型的指针变量,但它们内存单元都占4个单元,因为要保存32位的虚拟地址。
 int j=10;
 pi=&j;
        *pi=*pi+10;
 printf("%d,%d\n",*pi,j);//结果为20,20
 /*通过指针pi间接寻址变量j,把变量j的值增加10;也就是说*pi发生变化,j的值也就发生变化。
 根据指针找到变量,称为Deference。 */
 /*----------------------------------
    如果上述i是一个指针变量,即
      int  *i=100;//这个就相当于int *i;i=100;
 然后有
      int  *pri=i;
 或者
      int  *pri;
   pri=i;
         printf("%d,%d\n",pri,i);//打印结果为100,100

    则表示i指向哪,pri就指向哪。
 如果改成
      printf("%d,%d\n",*pri,*i);
   //则编译错误,*pri未初识化,属于野指针。

 -----------------------------------*/
 
 return 0;
  

}
/*----------------------------------------
有一种情况需要特别注意的是
 定义一个指针类型的局部变量而没有初始化
  ----------------------------------------
int main(){
 int *p;
 .......
 *p=0;
}
 -----------------------------------------
 在栈上分配的变量初始值是不确定的,也就是说
 指针p指向的内存地址是不确定的,后面用*p访
 问不确定的地址会导致不确定的后果,可能引发
 段错误,也可能意外导致程序指向不确定的地址
 称为“野指针”,
为避免出现野指针,在定义指
 针变量就应该明确地给它赋初值或者初识成Null;
 Null在C标准库的头文件stddef.h中定义为
 #define((void *)0)
 int *p=Null;//这样写把p变为空指针,空指针不
 允许访问。即使通过强制类型转换。
 空指针定义:把整型的0强制转换为void *指针,
 这个指针指向0地址。
 操作系统不会把任何数据保存在地址0及其附近,
 也不会0~0xfff页面映射到物理内存,所以任何对
 0地址的访问(比如*p=0;)一定会引发段错误(编译
 能通过)。
 。

-------------------------------------------*/
/*----------------------------------------

由于指针是标量类型,因此可以作为逻辑与、或、非
运算和if、for、while的控制表达式
 if(p) A;
  else B;
意思是指针p非空则执行语句A,如果指针是空指针,
则执行语句B。

void *可以定义指针,但void不能定义变量
void *指针不能直接Dereference,而必须先强制转换。
因为不能访问,下面这段代码不能通过。
-----------------------------------------------
#include<stdio.h>
int main(){
 int i;
    void *p;
 p=&i;
    printf("%d,%d\n",*p,i);
    return 0;
}
-----------------------------------------------
强制转换后写成
-----------------------------------------------
#include<stdio.h>
int main(){
 int i=23;
 int *j;
    void *p;
 p=&i;
 j=(int *)p;
 i=i-6;
    *j=*j+10;
    printf("%d,%d\n",*j,i);//打印结果为27,27
    return 0;
}
}
-------------------------------------------*/

笔记摘自《Linux C 编程 一站式学习》.宋劲杉  编著

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值