最近发现一个巨牛的人工智能的学习网站,给大家分享一下~可点击下方链接查看!
加油哦~各位!
定义:指针是一种变量,专门用于存储内存地址,其大小通常为 4 字节(32 位系统)或 8 字节(64 位系统)
核心价值:
声明方式:数据类型 *指针变量名
int *p; // 声明一个指向int类型的指针p
char *str; // 声明一个指向char类型的指针str
取地址运算符(&):获取变量的内存地址
int a = 10;
int *p = &a; // 将变量a的地址赋值给指针p
解引用运算符(*):通过地址访问变量的值
printf("%d", *p); // 输出指针p所指向的变量值,即10
*p = 20; // 修改指针p所指向的变量值
NULL 指针:不指向任何有效内存的指针
int *p = NULL; // 初始化空指针
if (p == NULL) { // 判断指针是否为空
// 处理空指针情况
}
指针变量的初始化
int a = 5;
int *p1; // 未初始化的指针(野指针,危险!)
int *p2 = &a; // 正确初始化,指向变量a
int *p3 = NULL; // 初始化为空指针
指针的运算
int arr[5] = {1,2,3,4,5};
int *p = arr;
p++; // 指针向后移动一个int类型的大小(通常4字节)
int len = &arr[4] - &arr[0]; // 结果为4(元素个数差)
多级指针:指向指针的指针
int a = 10;
int *p = &a; // 一级指针
int **pp = &p; // 二级指针
printf("%d", **pp); // 输出10
数组名的特性:数组名代表数组首元素的地址(常量指针)
int arr[5] = {1,2,3,4,5};
printf("%p", arr); // 输出数组首元素地址
printf("%p", &arr[0]); // 与上面输出相同
指针访问数组元素
// 以下两种方式等价
arr[2] = 10;
*(arr + 2) = 10;
数组指针(指向数组的指针)
int (*p)[5]; // 指向包含5个int元素的数组的指针
int arr[5] = {1,2,3,4,5};
p = &arr; // p指向整个数组
指针数组(元素为指针的数组)
int *p[5]; // 包含5个int*指针的数组
int a = 1, b = 2, c = 3;
p[0] = &a;
p[1] = &b;
p[2] = &c;
函数参数传递
void swap(int *x, int *y) {
int temp = *x;
*x = *y;
*y = temp;
}
// 调用方式
int a = 3, b = 5;
swap(&a, &b); // a和b的值会被交换
函数返回指针
int *createArray(int size) {
int *arr = malloc(size * sizeof(int));
return arr; // 返回动态分配内存的指针
}
函数指针(指向函数的指针)
int add(int a, int b) {
return a + b;
}
int (*funcPtr)(int, int); // 声明函数指针
funcPtr = add; // 函数指针指向add函数
int result = funcPtr(3, 5); // 调用函数,结果为8
字符串的两种表示形式
char str1[] = "hello"; // 字符数组
char *str2 = "world"; // 字符串常量指针
指针操作字符串
char *str = "hello";
while (*str != '\0') {
printf("%c", *str);
str++; // 移动指针访问下一个字符
}
字符串处理函数与指针
#include <string.h>
char *src = "hello";
char dest[20];
strcpy(dest, src); // 字符串复制
int len = strlen(src); // 获取字符串长度
malloc 函数:分配指定字节数的内存
int *p = (int*)malloc(5 * sizeof(int)); // 分配5个int的内存
if (p == NULL) {
// 内存分配失败处理
}
calloc 函数:分配内存并初始化为 0
int *p = (int*)calloc(5, sizeof(int)); // 分配5个int并初始化为0
realloc 函数:重新调整已分配内存的大小
p = (int*)realloc(p, 10 * sizeof(int)); // 将内存调整为10个int
free 函数:释放动态分配的内存
free(p); // 释放内存
p = NULL; // 避免野指针
野指针:未初始化的指针或指向已释放内存的指针
int *p; // 野指针,危险!
*p = 10; // 未定义行为
空指针解引用:对 NULL 指针使用解引用运算符
int *p = NULL;
*p = 5; // 程序崩溃
内存泄漏:动态分配的内存未释放
int *p = (int*)malloc(sizeof(int));
// 忘记调用free(p),导致内存泄漏
指针越界:访问超出数组范围的内存
int arr[5];
int *p = arr;
p[10] = 3; // 越界访问,可能导致程序崩溃