C-指针

指针

每一个变量都有一个内存位置, 每一个内存位置都定义了可使用 & 运算符访问的地址, 它表示了在内存中的一个地址.

指针也就是内存地址, 指针变量是用来存放内存地址的变量.

int a = 1;
int * p = NULL;
p = &a;
printf("变量a的地址为: %p", p);
printf("内存上存储的值为: %d", *p);
// *号: 间接运算符, 也叫解引用运算符, 用来获取对应地址存储的值
*p = 10;
printf("变量a的值为: %d", a);  // a = 10

传递指针给函数

通过引用或地址传递参数, 使传递的参数在调用函数中被改变.

#include <stdio.h>

void swap_value(int* v1, int* v2)
{
    int temp;
    temp = *v1;
    *v1 = *v2;
    *v2 = temp;
}

int main()
{
    int a = 1, b = 10;
    swap_value(&a, &b);
    printf("a = %d, b = %d", a, b);
    return 0;
}

从函数返回指针

允许函数返回指针到局部变量、静态变量和动态内存分配.

#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 ()
{
   int *p;
   int i;

   p = getRandom();
   for (i = 0; i < 10; i++)
   {
       printf("*(p + [%d]) : %d\n", i, *(p + i) );
   }

   return 0;
}

const类型

  • const 在定义指针前面, 不能通过指针改变指向变量的值

    int a = 1, b = 10;
    const int* p = &a;
    *p = 20;  // !!!报错!!!
    a = 20;  // 可以这样改变值
    p = &b;  // 可以改变指针的指向
    
  • const 在定义指针后面, 不能改变指针的指向

    int a = 1, b = 10;
    int* const p = &a;
    *p = 20;  // 可以改变值
    p = &b;  // !!!报错!!!
    
  • const 在定义指针的前面和后面, 兼顾以上两种

    int a = 1, b = 10;
    const int* const p = &a;
    *p = 20;  // !!!报错!!!
    p = &b;  // !!!报错!!!
    
posted @ 2023-03-27 23:02  Khrushchefox  阅读(24)  评论(0编辑  收藏  举报