C语言 指针使用笔记

最近遇到的问题需要经常使用到指针,所以我做了一个整理,也参考了一些其他的资料。

1.关于指针给函数传参的问题。

如果需要将一个数组传递给函数,函数会修改该数组,该数组之后会用到。那么传参的时候需要传递数组的首地址,也就是指针,和数据的长度。例如,以下代码:


void systemCall(int * logical_block_address,int *n_lbs){
    //文件路径、名称
    logical_block_address[0] = 10;
    logical_block_address[1] = 11;
    logical_block_address[2] = 12;
    logical_block_address[3] = 13;
    logical_block_address[4] = 14;
    logical_block_address[5] = 15;
    logical_block_address[6] = 16;
    logical_block_address[7] = 17;
    *n_lbs = 8;
    }


这个函数是为int数组赋值,数组长度根据函数确定。所有需要传入数组的指针和数组长度的指针。

 

2.关于指针类型的转换

有些时候,需要读取内存中的某个空间的二进制编码进行相关解析操作。

比如给定一段内存空间,写入一段char类型的数据,该内存空间有了数据。在本地创建了一个整形指针,需要将内存空间的数据解析成本地的整形数据。

   int * p6;
   p6 = malloc(sizeof(int)*2);
   char * chr = "helloword";
   printf("chr:%c\n",*chr);
   *p6 = *((int *)chr);//***表示chr类型的指针强转成int型的指针,最后给相应指针的内容赋值。
   printf("(char)p6:%x\n ",*p6);

最重要的是 (int *) chr 强转的这个指令,是将char类型的指针强转成 int类型的指针。

3.其他基本操作的示例代码


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

int * getRandom( )
{
   static int  r[10];
   int i;

   /* 设置种子 */
   srand( (unsigned)time( NULL ) );
   for ( i = 0; i < 10; ++i)
   {
      r[i] = rand();
      printf("%d\n", r[i] );
   }

   return r;
}
int main(void){
   //指针中存放的是指向内存的首地址
   //&表示取地址,指向某个变量的首地址
   //*表示得到该地址存放的变量。

   //1.指针的创建
   int a = 2;
   int * p1= &a;
   printf("addr p1:%x\n",p1);
   printf("value p1 pointed:%x\n",*p1);
   //2.指针的算数运算
   //数组是常量指针,不能进行算数运算。指针可以进行算数运算。
   int  var[] = {10, 100, 200};
   int  *ptr = var;
    for (int i = 0; i < 3; i++)
   {
      printf("存储地址:var[%d] = %x\n", i, ptr );
      printf("存储值:var[%d] = %d\n", i, *ptr );
      /* 移动到下一个位置 */
      ptr++;
   }
   //3.指针数组和指向数组的指针
   int *p2[3];//指针数组,数组中的每一个元素都指向int数据
   int *p3[] = {1,2,3};
   for(int i = 0;i <3;i++){
        p2[i] = &var[i];
    printf("p2[%d]:%d\n",i,*p2[i]);
    printf("p3[%d]:%d\n",i,p3[i]);
   }
   //4.指向指针的指针
   int **p4;
   p4 = &p1;
   printf("**p4:%d\n",**p4);
   //5.指针作为函数参数
   //指针作为函数参数传递,实际上是传递一个地址进去。
   //在函数内部生命静态变量,可以将指针返回给全局变量。
      int *p5 = getRandom();
   for ( int i = 0; i < 10; i++ )
   {
       printf("*(p + [%d]) : %d\n", i, *(p5 + i) );
   }
   //6.关于非数组类型指针使用说明
   //指针指向一片内存空间,对内存空间进行访问。
   int * p6;
   p6 = malloc(sizeof(int)*2);
   char * chr = "helloword";
   printf("chr:%c\n",*chr);
   *p6 = *((int *)chr);//***表示chr类型的指针强转成int型的指针,最后给相应指针的内容赋值。
   printf("(char)p6:%x\n ",*p6);

    return 0;}
 


参考:https://www.runoob.com/cprogramming/c-pointers.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值