【C语言】指针

回顾三年的开发生涯,越发觉得C语言中的基本知识很重要,因此查阅相关资料文档,写下这篇记录C语言指针相关知识点,以供随时查阅。

想要成为一名优秀的C程序员,学习并熟练掌握指针是很有必要的

每一个变量都有一个内存位置,可使用连字号(&)运算符访问变量地址,请看下面的实例,它将输出定义的变量地址:

#include <stdio.h>

int main() { 
     int var1 = 10;
     char var2[10];
     printf("var1  地址: %x\n", &var1  );
     printf("var2  地址: %x\n", &var2  ); 
    return 0;
}
var1  地址: 5fbff764
var2  地址: 5fbff77e

什么是指针?

type *point_name

指针是一个变量,其值指向的是另外一个变量的内存地址;
type 是指针的基类型,它必须是一个有效的 C 数据类型,point_name 是指针变量的名称;

int    *p_int;       /* 一个整型的指针 */
double *p_double;    /* 一个 double 型的指针 */
float  *p_float;     /* 一个浮点型的指针 */
char   *p_char       /* 一个字符型的指针 */

简单使用指针:

#include <stdio.h>

int main() {
     int  var = 200;   
     int  *point;      
     point = &var;  
     printf("变量地址: %x\n", &var  ); 
     printf("指针指向变量地址: %x\n", point );  
     printf("*point指针指向变量的值: %d\n", *point );
     return 0;
}
变量地址: 5fbff77c
指针指向变量地址: 5fbff77c
*point指针指向变量的值: 200

NULL指针

赋为 NULL 值的指针被称为空指针。
int *p = NULL

指针的算数运算(++、–、+、-)

#include <stdio.h>

int main() { 
    int  var[3] = {20, 60, 100};
    int  i, *ptr;
    ptr = var; /* 指针中的数组地址, 也是数组首元素地址 */
    for ( i = 0; i < 3; i++) {
         printf("存储地址:var[%d] = %x\n", i, ptr );
         printf("存储值:var[%d] = %d\n", i, *ptr ); 
         ptr++; /* 移动到下一个位置, 递增,  ptr-- 递减*/

        }
    return 0;
}
存储地址:var[0] = 5fbff77c
存储值:var[0] = 20
存储地址:var[1] = 5fbff780
存储值:var[1] = 60
存储地址:var[2] = 5fbff784
存储值:var[2] = 100

指针比较:

#include <stdio.h>

int main() { 
    int count = 3;
    int  var[3] = {20, 60, 100};
    int  i, *ptr;
    ptr = var; /* 指针中的数组地址, 也是数组首元素地址 */
    while (ptr <= &var[count - 1] ) {
        printf("存储地址:var[%d] = %x\n", i, ptr );
         printf("存储值:var[%d] = %d\n", i, *ptr ); 
         ptr++;  
         i++;
    } 
    return 0;
}
存储地址:var[0] = 5fbff77c
存储值:var[0] = 20
存储地址:var[1] = 5fbff780
存储值:var[1] = 60
存储地址:var[2] = 5fbff784
存储值:var[2] = 100

指针数组

int *p[num]
p 定义为一个数组,由num个元素组成,p中每个元素都是一个指向int值得指针;


#include <stdio.h>

const int num = 3;
int main () {
   int  var[] = {30, 2, 63};
   int i, *ptr[num]; 
   for ( i = 0; i < num; i++) {
      ptr[i] = &var[i]; /* 赋值为整数的地址 */
   }
   for ( i = 0; i < num; i++) {
      printf("Value of var[%d] = %d\n", i, *ptr[i] );
   }
   return 0;
}
Value of var[0] = 30
Value of var[1] = 2
Value of var[2] = 63

指向指针的指针

指向指针的指针是一种多级间接寻址的形式,或者说是一个指针链。

#include <stdio.h>

int main() {
    int  var = 7;
    int  *ptr;
    int  **pptr;
    ptr = &var; /* 获取 var 的地址 */
    pptr = &ptr; /* 使用运算符 & 获取 ptr 的地址 */ 
    printf("var = %d\n", var );
    printf("*ptr = %d\n", *ptr );
    printf("**pptr = %d\n", **pptr); /* 使用 pptr 获取值 */
    return 0;
}
var = 7
*ptr = 7
**pptr = 7 

传递指针给函数,函数参数

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

void getSeconds(unsigned long *par); 
int main () {
   unsigned long sec;  
   getSeconds( &sec ); 
   /* 输出实际值 */
   printf("Number of seconds: %ld\n", sec ); 
   return 0;
}

void getSeconds(unsigned long *par) {
   /* 获取当前的秒数 */
   *par = time( NULL );
   return;
}

Number of seconds :1294450468

能接受指针作为参数的函数,也能接受数组作为参数;

#include <stdio.h>

/* 函数声明 */
double getAverage(int *arr, int size);

int main () {
   /* 带有 5 个元素的整型数组  */
   int balance[5] = {1000, 2, 3, 17, 50};
   double avg;

   /* 传递一个指向数组的指针作为参数 */
   avg = getAverage( balance, 5 ) ;

   /* 输出返回值  */
   printf("Average value is: %f\n", avg );

   return 0;
}

double getAverage(int *arr, int size) {
  int    i, sum = 0;       
  double avg;     
  for (i = 0; i < size; ++i) {
    sum += arr[i];
  } 
  avg = (double)sum / size; 
  return avg;
}
Average value is: 214.40000

从函数返回指针:

C 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量。

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值