C语言入门-指针入门


指针概述
     
     所有的变量都会在内存空间分配一块内存,指针是用来表示这块内存空间的地址的,可以用取地址符&来获取一个变量在内存空间的地址,如果想存放一个地址,就可以用一个指针变量来存放,存放内存地址的变量就是指针变量
     指针是用来表示一块内存地址的,指针变量是用来存放内存地址的
     
#include <stdio.h>
#include <stdlib.h>
main()
{
      int i = 10;
      int* p = &i;
      printf("%#x\n",p);
     
      //p = NULL;
      //printf("i=%d\n",i);
      //i=10
     
      //printf("*p=%d\n",*p);
      //*p=10
     
      //*p = 100;
      //printf("i=%d\n",i);
      //i=100
     
      i = 90;
      printf("*p=%d\n",*p);
      //*p=90
     
      /**
      总结
         p是一个指针变量,存储的是i的内存地址
         *p和i其实代表的是同一块内存空间
     
      */
      system("pause");
}
     
     值的交换

 #include <stdio.h>
#include <stdlib.h>
//形参i,j等于是重新开辟了两块内存地址更跟实参i,j已经没有什么关系了
void swap(int i,int j){
      int temp;
      temp = j;
      j = i;
      i = temp;
     
}
//p,q和i,j代表的都是同一块内存地址
void swap_pointer(int* p,int* q){
     int temp;
     temp = *q;
     *q = *p;
     *p = temp;
}
main()
{
     
     
      int i = 10;
      int j = 30;
     
      printf("交换前...\n");
      printf("i=%d\n",i);
      printf("j=%d\n",j);
     
      //swap(i,j);
      swap_pointer(&i,&j);
      
      printf("交换后...\n");
      printf("i=%d\n",i);
      printf("j=%d\n",j);
      system("pause");
}

指针当中的常见错误
     
 #include <stdio.h>
#include <stdlib.h>
main()
{
     
      /**垃圾指针,野指针*/
      //int* p;//p还未指向任何内存空间,不能够被使用
      //printf("*p=%d\n",*p);
      //*p = 2425;
     
      /**类型的不同的指针不可以相互转换*/
      int i = 9999;
      char* c;
      c = &i;
      printf("*c=%c\n",*c);
      
      system("pause");
}

      不可使用已回收掉了的指针变量

 #include <stdio.h>
#include <stdlib.h>
//函数完成时i将会被回收
void func(int** q){//代表的是指针变量的指针变量
     int i = 3;
     *q = &i;//*q代表的是指针变量p    
}
main()
{
      int* p;
      printf("p的内存地址为%#x\n",p);
     
      printf("i=%d",*p);//注:有可能在i还未被回收时获取到值
      system("pause");
}
 
通过传递指针变量让子函数修改主函数中变量的值 

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

//可以通过传递指针变量的方式,在子函数中修改主函数中变量的值
void func(int* p,int* q){
     *p = 100;
     *q = 200;
}

main()
{
     
      int i = 10;
      int j = 20;
     
      func(&i,&j);
     
      printf("i=%d\n",i);
      printf("j=%d\n",j);
     
      system("pause");
}


字符串和数组

#include <stdio.h>
#include <stdlib.h>
/**
数组是一块连续的内存空间
数组的名字代表的是数组的首地址和arr[0]的内存地址是一样的
后续元素的内存地址都是在首地址的基础上后移
arr[0] == *(arr+1)
*/
//打印数组中的每一个元素
void printArr(int* arr,int len)
{
     int i=0;//c99版本中必须在外面进行初始化
     for(;i<len;i++)
     {
        printf("arr[%d]=%d\n",i,*(arr+i));       
     }
}

main()
{
      //字符串数组
      char carr[20] = {'a','b','c','\n'};
      printf("carr=%s\n",carr);
      printf("carr=%#X\n",&carr);
      printf("&carr[0]=%#X\n",&carr[0]);
      printf("carr[1]=%c\n",*(carr+1));
     
      //char指针类型来代替字符串
      //char* arr1 = "abc\n";
      //printf("arr1=%s",arr1);
     
      int  arr[5] = {1,2,3};
      printf("arr=%#x\n",arr);
      printf("&arr[0]=%#X\n",&arr[0]);
      printf("arr[1]=%d\n",*(arr+1));
      
      printArr(arr,5);
      system("pause");
}

指针的运算

#include <stdio.h>
#include <stdlib.h>
/**
   指针的运算并不是向上或向下移动一个字节
   而是按照约定的类型,移动约定的类型的字节数
*/
main()
{
      //char类型在内存中占一个字节
      char charArr[4] = {'a','b','c','d'};
      char* cp = &charArr[2];
      printf("*(cp-1)=%c\n",*(cp-1));
     
      //int类型在内存中占4个字节
      int intArr[4] = {1,2,3,4};
      int* ip = &intArr[2];
      printf("*(ip-1)=%d\n",*(ip-1));
     
      system("pause");
}

指针占多少个字节

#include <stdio.h>
#include <stdlib.h>
main()
{
      int i = 2;
      float f = 2;
      double d = 2;
      char c = 'b';
     
      int* ip = &i;
      float* fp = &f;
      double* dp = &d;
      char* cp = &c;
     
      printf("int指针占的长度为%d\n",sizeof(ip)); 
      printf("float指针占的长度为%d\n",sizeof(fp));
      printf("double指针占的长度为%d\n",sizeof(dp));
      printf("char指针占的长度为%d\n",sizeof(cp));
      /**
      int指针占的长度为4
      float指针占的长度为4
      double指针占的长度为4
      char指针占的长度为4
      */
     
      /**
     
      32位操作系统最大表示的内存空间为2的32次方
      指针只需要4位 就可以表示出来所有的内存空间
     
      64位操作系统,当编译器支持64位时,指针所占的长度为8byte
      */
      system("pause");
}

函数指针

 #include <stdio.h>
#include <stdlib.h>
int add(int x,int y)
{
    printf("x+y=%d\n",x+y);
}
main()
{
      //函数指针
      int (*pFunc) (int x,int y);
      pFunc = add;
      pFunc(4,9);
      system("pause");
      return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值