不可或缺 Windows Native (7) - C 语言: 指针
作者:webabcd
介绍
不可或缺 Windows Native 之 C 语言
- 指针
示例
cPointer.h
#ifndef _MYHEAD_POINTER_ #define _MYHEAD_POINTER_ #ifdef __cplusplus extern "C" #endif char *demo_cPointer(); #endif
cPointer.c
/* * 指针 */ #include "pch.h" #include "cPointer.h" #include "cHelper.h" void pointer_demo1(); void pointer_demo2(); void pointer_demo3(); void pointer_demo4(); void pointer_demo5(); void pointer_demo6(); void pointer_demo7(); void pointer_demo8(); void pointer_demo9(); void pointer_demo10(); char *demo_cPointer() { // 指针的基本概念 pointer_demo1(); // 字符串指针 pointer_demo2(); // 把指针做为参数传递 pointer_demo3(); // 数组指针的运算 pointer_demo4(); // 二维数组的指针 pointer_demo5(); // 函数指针(指向函数的指针) pointer_demo6(); // 指针型函数(函数返回值可以是一个指针) pointer_demo7(); // 指针数组 pointer_demo8(); // 指针的指针 pointer_demo9(); // void 类型的指针 pointer_demo10(); return "看代码及注释吧"; } // 指针的基本概念 void pointer_demo1() { /* * 注: * 1、未经赋值的指针变量不能使用 * 2、一个指针变量只能指向相同类型的变量,比如指针 p 如果指向了整形变量,就不能再指向字符变量或其他非整型类型的变量了 */ // 定义一个指针,并将其赋值为一个空指针(对应的宏定义 #define NULL 0)。所谓空指针就是不指向任何内容的指针 int *p_empty = NULL; // 相当于 int *p = 0; // 定义一个整型变量,并初始化 int i = 100; // *p - 代表定义一个名为 p 的指针。此处的“*”是类型说明符,表示 p 是一个指针 // &i - 代表取变量 i 的地址。此处的“&”是取地址运算符,表示取变量 i 的地址 int *p = &i; // *p - 代表取指针 p 所指向的内容。此处的“*”是取内容运算符,表示取指针 p 所指向的内容 int j = *p; } // 字符串指针 void pointer_demo2() { // 定义一个字符串指针(字符串是以' '结尾的) char *p = "i am webabcd"; // p 就是字符串指针,p + 5 所指向的结果就是 webabcd char *name = p + 5; // 字符串长度 int length = strlen(name); // 7,不包括 ' ' // 指针占用的内存空间 int memory = sizeof(name); // 我这里是 4 字节 char *p_address = (char *)malloc(32); sprintf(p_address, "%p", name); // 指针 name 的地址值,我这里是 32 位的,类似 6416C99D free(p_address); } // 把指针做为参数传递 void pointer_demo3() { int m = 1; int n = 2; int *x = &m; int *y = &n; // 调用 swap 后: *x = m = 2, *y = n = 1 void swap(int *i, int *j); swap(x, y); } void swap(int *i, int *j) // 交换两个指针指向的整型值 { // 形参是实参的副本,被调用期间分配内存单元,调用结束立即释放 // 对于指针来说也是这样的,只不过是 copy 了地址做为副本 int temp; temp = *i; *i = *j; *j = temp; } // 数组指针的运算 void pointer_demo4() { int ary[] = { 11, 22, 33, 44, 55, 66 }; // 因为 ary 是数组的首地址,所以 ary == &ary[0] if (ary == &ary[0]) { // ary 是数组的首地址,即数组第一个元素的地址,对其取内容后就是数组第一个元素的内容,结果为 11 int x1 = *ary; // 数组指针是可运算的,运算的是元素在数组中的位置索引,拿 ary + 2 举例,ary 数组第 1 个元素的指针,加 2 后就是数组第 3 个元素的指针,取其内容后结果为 33 int x2 = *(ary + 2); char *p0_address = (char *)malloc(32); sprintf(p0_address, "%p", ary); // 假定此处指针本身的值为:0535DC30 的话 free(p0_address); char *p1_address = (char *)malloc(32); sprintf(p1_address, "%p", ary + 1); // 那么如果整型是 4 字节的话,则此处指针本身的值为 0535DC34 free(p1_address); } // 再来一个指针运算的例子(将字符串 str1 复制到字符串 str2) char str1[] = "i am webabcd", str2[20], *p1, *p2; p1 = str1; p2 = str2; for (; *p1 != '