C指针

经常在网上看一些资料说,学习C语言不懂指针跟没血一样,指针也是C语言中最难学的,指针在C语言中可以做很多事,如:交换两个变量的地址,地址传值。

指针概念

指针变量也是一个变量
指针存放的内容是一个地址,该地址指向一块内存空间

指针变量的定义

可以定义一个指向一个变量的指针变量

int *p; // 表示定义一个指针变量
*p; // 代表指针所指内存的实际数据
// 指针变量只能存放地址,不能将一个int型变量直接赋值给一个指针 如:int *p = 100; 
在 XCode 报警告,如下:
//Incompatible integer to pointer conversion initializing "int *" with an expression of type "int"
printf("%p
", *p); // Format specifies type "void *" but the argument has type "int"

&取地址运算符

&可以取得一个变量在内存当中的地址

无类型指针

定义一个指针变量,但不指定它指向具体那种数据类型。可以通过强制转化将void *转化为其他类型指针,也可以用(void *)将其他类型指针强制转化为 void 类型指针。
void *p
NULL 在 C 语言中的定义为 (void *)0

空指针与野指针

指向 NULL 的指针叫空指针,没有具体指向任何变量地址的指针叫野指针

内存单位:
byte 是内存中最小单位,每个byte在内存中都有唯一的编号,这个编号就是内存地址,
在32位系统下是一个32位的整数
00000000 00000000 00000000 00000000
在64位系统下是一个64位的整数
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000

指针的兼容性

指针之间赋值比普通数据类型赋值检查更为严格,如:不可以把一个double *赋值给 int *
一定要相同类型的指针指向相同类型的变量地址,不能用一种类型的指针指向另一个类型的变量地址

指向常量的指针与指针常量

const char *p; // 定义一个指向常量的指针
char * const pp; // 定义一个指针常量,一旦初始化之后其内容不可改变

指针与数组的关系

一个变量有地址,一个数组包含若干个元素,每个元素在内存中都有地址

int a[2] = {1, 2};
int *p =a;
printf("%p
", &a[0]);
printf("%p
", p);

p 和 &a[0] 的地址相同
数组的第一个元素地址就是数组的首地址
数据地址在内存中是连续的

指针运算

指针运算不是简单的整数加减法,而是指针指向的数据类型在内存中占用字节数做为倍数的运算

printf("%ld
", sizeof(p));

指针在内存中占 8 个字节

char *p;
p++; // 移动 sizeof(char) 个字节数
int *p1;
p++; // 移动 sizeof(int) 个字节数
#include <stdio.h>
int main(int argc, const char * argv[]) {
    int a = 1;
    int *p = &a; // 赋值
    int i = *p;
    printf("%d
", i);
	// 将一个整数加(减)给指针:p+3; p-3;
	// p1 - p2 通常用于同一个数组内求两个元素之间的距离
	// p1 == p2 通常用来比较两个指针是否指向同一个位置
    return 0;
}

指针使用数组元素

#include <stdio.h>

int main(int argc, const char * argv[]) {
    int a[5] = {1, 2, 3, 4, 5};
    int *p = a;
    printf("%d
", *p); // 取数组的第一个元素
    printf("%d
", ++(*p)); // 取数组的第一个元素

    return 0;
}

p+1 代表 &a[1] 也可以使用 p[1]

指针数组

int *p[5];

指向指针的指针(二级指针)

指针就是一个变量,既然是变量也就存在内存地址,所以可以定义个一指向指针的指针

int i = 10;
int *p1 = &i;
int **p2 = &p1
printf("%d
", **p2);

以此类推可以定义3级甚至多级指针。C语言允许定义多级指针,但是指针级数过多会增加代码的复杂性,但实际编程的时候最多用到3级,但3级指针也不常用,一级和二级指针是大量使用。

hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » C指针