【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
- C语言中的指针
- C语言指针问题
- C语言野指针
- C语言之指针
- C语言指针简介
- C语言的指针
- c语言指针点滴
- C语言的指针
- c语言指针简介
- c语言 数组 指针
- c语言指针详解
- 理解C语言指针
- c语言函数指针
- C语言指针
- C语言之指针
- c语言指针详解
- c语言中的指针
- C语言--指针,数组
- pod 'KVOController', '~> 1.2.0'
- 文章标题
- java学习之道 --- 如何学习java?
- CodeForces
- CSU1855:Shut the Box(二进制状态压缩+BFS)
- 【C语言】指针
- 跟小博老师一起学习数据库 ——WHERE子句
- JavaScript最全正则表达式
- Gym
- C++基础笔记
- javascript找到提供的句子中最长的单词,并计算它的长度
- 20170401去哪儿笔试
- peach
- 在线工具地址搜集(二)