黑马程序员_C语言_指针

来源:互联网 发布:php程序员岗位职责 编辑:程序博客网 时间:2024/05/17 08:52

一.指针的基本概念

 

* number = 10;//*是什么意思呢?

//    1.通过number这个地址,找到他指向的空间

//    2.到这个空间里,取出里面存储的值


普通变量基本格式:

变量类型 变量名;


指针变量基本格式:

   变量类型 * 指针变量名

  指针里面存的是别的变量的地址 %p来打印值是0x开头的,16进制数字

  指针变量在内存中占8个字节


    int * pointer;//定义一个指针, *只是一个标识符,不属于变量名字,没有任何意义


  > 定义一个指针变量的时候, *只是一个标识符,不属于变量名字,也不属于变量类型名字,没有任何意义

  > *放在一个指针变量的前面的时候,是什么意思呢?

    1.通过指针里面存的这个地址,找到他指向的空间

    2.到这个空间里,取出里面存储的值


int   num2 =16127;

int *  p = &num2;

*p =66;

        printf("%d",num2);

//    num2 = 20;//直接改变num2的值


*.指针的注意点


1.指针变量保存变量的地址的类型,必须和指针变量的类型一样

int * p;// p只能保存int类型变量的地址


错误写法:

double d = 10.1;

p = &d;//取出了(double类型变量)d的地址,赋值给了(只能保存int类型变量的地址)p


2.指针变量只能存储地址,不能直接把常量赋值给他

   int *p1;

   int num =10;

   p1 = #//正确的

    p1 = 250;//理论上没错,但实际开发不这样写


3.指针变量没有初始化,没有保存任何变量的地址,没有指向任何的变量,不能间接访问

   int *p2;

   printf("p2 = %d\n",*p2);//p2是个野指针


4.指针变量也是变量,所以也是可以定义的同时初始化

//    int *p3;

//    int num2 = 10;

//    p3 = &num2;

      int *p3 = #


5.多个指针变量同时指向同一个变量(多个指针变量同时保存一个变量的地址)

   int b = 10;

     int *p5 = &b;

     int *p6;

    p6 = &b;


6.指针的指向可以改变(一个指针可以改变里面保存的地址,只要是类型匹配)

   int c = 20;

   p6 = &c;

    

7.不使用的指针,就把指针清空  置成 NULL

    int e = 10;

   int *p7 = &e;

   printf("%d\n",*p7);

//   清空指针

   p7 = NULL;

//    p7 = 0;


二.指向指针的指针


    int i =10;//普通变量类型

   int * ip = 202;//指针也是数据类型

    int ** ipp;//ipp这个指针变量,就是指向指针的指针

    ipp = &ip;


三.指针与数组


int ages[5] = {1,3, 12, 65, 23};

 

     访问数组元素有3种方式 (其实这3种方式,在编译的时候,都是一样的)

     1.数组名[角标]

     2.指针变量名[角标]

     3.*(指针变量名 + 角标)

     1.1 printf("ages[2] = %d\n",ages[2]);

     2.1 printf("p[2] = %d\n",p[2]);

     3.1 printf("ages[%d] = %d\n",i,*(p + i));

    

重点:指针变量+几,是加上指针变量类型所占用的字节数


数组名字作为函数的参数传递的时候,会把数组名自动转换成地址

所以通过指针来接收,指针指向的是第0个元素

void printArray(int *array)//遍历一个数组,还是需要从外界传过来元素个数

{

//    int length = sizeof(array)/sizeof(int);

//    printf("length = %d\n",length);

//    for (int i = 0;i < length; i++) {

//        printf("array[2] = %d\n",*(array + 2));

//    }

        *(array +3) = 0;

}

int main(int argc,const char * argv[])

{

   int ages[5] = {12,34, 23, 81, 15};

//    int length = sizeof(ages)/sizeof(int);


//     printf("length = %d\n",length);

    printf("ages[3] = %d\n",ages[3]);

    printArray(ages);

    printf("ages[3] = %d\n",ages[3]);

    

   return 0;

}


四.指针与字符串


 char * 保存的是不可变字符串 char *是一个常量

 char name[] char数组里面保存的是可以变的字符串


常量区存放的特点:一个的常量地址是一样的

   char *name2 = "lty";

   char *name3 = "lty";

   char *name4 = "lty";

    //name2name3name4三个指针都是指向同一块地址



地址是变化的

    char name[] ="lty";

   char name5[] = "lty";


五.指针作为函数的返回值


//注意点:当用数组保存字符串的时候,是放在栈里的,当函数执行完毕就释放了


char * test2()

{

       char *name = "lty";

    //    return "lty";

    //char name[10] = "lty";

   return name; //错误写法

}

int main()

{

    

    //    int result = test();

    //    printf("%d\n",result);

   char *result = test2();

    

   printf("%s\n",result);

    

   return 0;

}


0 0
原创粉丝点击