【C语言】指针

来源:互联网 发布:中华养生 源码 编辑:程序博客网 时间:2024/06/07 14:32

回顾三年的开发生涯,越发觉得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  地址: 5fbff764var2  地址: 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] = 30Value of var[1] = 2Value 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;}
0 0
原创粉丝点击