C-指针笔记

一、指针
1.指针是一个值为内存地址的变量
指针是一个变量,用来存放另一个变量的地址。
2.基本用法:
数据类型*指针变量名;
例如:
int* ptr_num;
charptr_name;
float
money_ptr;
doublep_price;
注意: 在头文件<stdio.h>中,NULL被定义为常量
int
ptr_num=NULL;
指针的初设值为空,表示指针不指向任何地址
3.

#include <stdio.h>
#include <stdlib.h>
int main()
{
        int  num = 7;
        int * ptr_num=&num;
        printf("num 变量地址是:%p\t%x\n",ptr_num,&num);       //%p  指针占位符,  %x  16进制占位符
    return 0;
}

1
4.

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int  num1 = 1024;
    int  num2 = 2048;
    int *ptr1;
    int *ptr2;
    ptr1 =&num1;
    ptr2 =&num2;
    printf("num1的值是%d\t num1的地址是:%p\n",num1,ptr1);
    printf("num2的值是%d\t num2的地址是:%p\n",num2,ptr2);
    //将变量1的值赋值给变量2
    // *ptr2=*ptr1;与 num2=num1;等价
    //直接操作指针
    ptr2=ptr1;

    printf("重新赋值后: \n");
    printf("num1的值是%d\t num1的地址是:%p\n",num1,ptr1);
    printf("num2的值是%d\t num2的地址是:%p\n",num2,ptr2);

    *ptr2=11111;
    printf("重新赋值后: \n");
    printf("num1的值是%d\t num1的地址是:%p\n",num1,ptr1);
    printf("num2的值是%d\t num2的地址是:%p\n",num2,ptr2);

    return 0;
}

2
5.
一个变量就是一块内存空间,内存空间就是有地址。
指针同样是一个变量,只不过该变量中储存的是另一个是对象的内存地址;
如果一个变量储存另一个对象的地址,则称该变量指向这个对象。
指针变量可以赋值,指针的指向在程序执行中可以改变;
指针P在执行中某时刻指向变量X,在另一时刻也可以指向变量y
注意:
指针变量的命名规则和其他变量命名规则一样;
指针不能与现有变量同名;
指针可存放C语言中的任何基本数据类型,数组和其他所有高级数据结构的地址;
若指针已声明为指向某种类型数据的地址,则它不能用于存储其他类型数据的地址;
应为指针指定一个地址后,才能在语句中使用指针。

二、指针与数组
1.数组:
存储在一块连续的内存空间中
数组名就是这块连续内存空间的首地址
2.指针算数运算
指针的递增和递减++、–
3.

int num[50];//num是数组名,也是数组的首地址
num的值与&num[0]的值相同
数组第i+1个元素可表示为:

第i+1个元素的地址:&num[i]或num+i
第i+1个元素的值:num[i]*(num+i)

为指向数组的指针赋值:
int*put_num=num;int*put_num=&num[0];
指针变量可以指向数组元素
int*ptr_num=&num[4];int*ptr_num=num+4;
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int array[]={15,12,13,45,55};
    int i;
    int *ptr_array= array;
    //赋值完毕后,就可以使用指针访问数组元素
    for(i=0; i<5;i++)
    {
       // printf("第%d个元素的值为%d\t地址为:%p\n",i+1,ptr_array[i],&ptr_array[i]);
        //printf("第%d个元素的值为%d\t地址为:%p\n",i+1,*(ptr_array+i),&ptr_array+i);
        printf("第%d个元素的值为%d\t地址为:%p\n",i+1,*ptr_array,&ptr_array);
        //每次循环都会移动指针,要注意重置
        ptr_array++;

    }

    return 0;
}

0
5.

#include <stdio.h>
#include <stdlib.h>
#define   N 5
int main()
{
    int array[N]={15,12,13,45,55};
    //实现数组的逆序-数组首尾元素交换
     int temp;    //临时变量
     int i;
     for(i=0;i<N/2;i++)
     {
         //第i个值和第N-i-1个值互交换
         temp = array[i];
         array[i]=array[N-i-1];
         array[N-i-1]=temp;
     }
     printf("\n");
     for(i=0;i<N;i++)
     {
         printf("%d\t",*(array + i));
     }

2
6.

#include <stdio.h>
#include <stdlib.h>
#define   N 5
int main()
{
    int array[N]={15,12,13,45,55};
    //实现数组的逆序-数组首尾元素交换
     int temp;    //临时变量
     int i;
     int *ptr_array_start=array;              //指向数组首地址的指针
     int *ptr_array_end =array+N - 1;  //指向数组末元素的指针
     while(ptr_array_start != ptr_array_end)
     {
         //首尾交换,指针分别进行更新
         temp=*ptr_array_start;
         *ptr_array_start=*ptr_array_end;
         *ptr_array_end=temp;
         //首元素指着要向后移动
         ptr_array_start++;
         //末元素指针要向前移动
         ptr_array_end--;
     }

     printf("\n");
     for(i=0;i<N;i++)
     {
         printf("%d\t",*(array + i));
     }

2
7.二维数组与指针
首地址:&a【0】【0】
使用指针访问二维数组中的元素

*(a[1]+2*(*(a+1)+2)

#include <stdio.h>
#include <stdlib.h>
#define   N 5
int main()
{
    //数组名就是数组的首地址(数组元素首地址)
    //二维数组的理解:1-是由n个一位数组所组成
    int i, j;
    double score[5][3]={
    {51,76,77},
    {53,46,97},
    {54,26,37},
    {57,16,67},
    {55,96,87},
  };
  for(i=0;i<5;i++)
  {
      for(j=0;j<3;j++)
      {
          //printf("%.2lf\t",score[i][j]);                  //score[i]=>*(score+i)
          printf("%.2lf\t",*(*(score+i)+j));
      }
      printf("\n");
  }

3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值