回顾三年的开发生涯,越发觉得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;
}