C语言基础之指针基础
指针基础——一级指针
认识指针
- 指针是什么
- 指针可以直接理解为一个地址
- 变量或者函数等等在计算计算机内存中具体的地址
- 所有的地址编号都是一个整数
- 指针变量
- 存放指针(地址)的变量
- 指针变量存储的是一个整数(OS对于内存的一个编号)
创建指针变量
-
指针变量: 类型* 变量名;
int* pNum; //创建指针,整型指针 char* pcNum; //字符型指针
-
空指针
-
表示方式
int* pNum = NULL;
-
本质是:把数字0强制转换为一个空类型的地址,可以赋值给任何类型指针变量
-
-
变量地址取值
- &变量名
- 对于数组,数组名就是地址
- 注意:程序运行时候是一段虚拟的内存,程序运行完后,回收掉,下一次运行重新分配给你,所以变量地址都是变化。
-
指针变量操作
-
赋值运算
- 要保证两个类型一致
- 指针类型和指针所指向的类型
- 求指针类型
//类型 变量名; int* pInt=NULL; //指针变量的类型: int* 去掉变量名就是指针变量类型 //指针所指向的类型: int 去掉变量名和*号 int(*p)[3]; //p的类型: int(*)[3]; //p指针所指向的类型: int[3]
- 要保证两个类型一致
-
取值运算
- *地址 或者 *指针变量 取当前指针变量表示的内存中存储数据
- 指针变量[0] 也是代表取值运算
int* pInt = &iNum; int* pNum = NULL; pNum = &cNum; printf("%d\t%d\n",*pInt,*(&cNum)); printf("%d\t%d\n",pNum[0]); //与*(pNum+0) 等效
-
指针运算
-
p+n或者p-n操作: 指针的运算和指针所指向类型是有关系,指针运算是按照字节数来做偏移的
-
操作不同类型的数据,偏移的字节数是不一样的
p+n 解析为: p+sizeof(指针所指向的类型)*n; int* p; p+1 : p+sizeof(int)*1; //p偏移4字节 int(*p)[3] p+1 : p+sizeof(int[3])*1 //p偏移4*3,12个字节 char* p; p+1 : p+sizeof(char)*1; //p偏移1字节
-
-
一般情况没有任何关联的指针,不会去做±*/运算
- 只有在连续的内存中,两个指针做减法才有意义
-
++和–操作
- p++: p=p+1
一级指针操作数组
- 一级指针操作一维数组的时候直接把指针当作数组用
- 操作数字类的一般不用指针自增或者自减
- (*pp)-- *p-- 是不同的两种东西
- 没有括号–是作用在指针上的, 有括号,–作用在指针表示的变量上
- 数组名是一个不可以改变的指针变量
- 只有当两个指针指向同一个数组,做减法才有实质含义
#include <stdio.h>
void print(int array[], int arrayNum)
{
}
void printArray(int* array, int arrayNum)
{
for (int i = 0; i < arrayNum; i++)
{
//*(array+i) 等效 array[i] 等效 *(array+i)[0];
//array+i 等效&array[i];
//输入数组的时候可以用指针得写入(要用到地址的时候)
printf("%d\t", array[i]);
//scanf("%d",&array[i]);
//scanf("%d",array+i);
}
printf("\n");
}
int main()
{
int array[3] = { 1,2,3 };
printf("%p\t%p\n", array, &array[0]);
int* p = array;
//上面的赋值和下面赋值语句是等效的
p = &array[0];
for (int i = 0; i < 3; i++)
{
printf("%d\t", p[i]);
}
printf("\n");
printArray(array, 3);
//按照指针用法
for (int i = 0; i < 3; i++)
{
printf("%d\t", *(p + i));
//p+i
//p+0 等效&array[0];
//p+1 等效&array[1];
}
printf("\n");
for (int i = 0; i < 3; i++)
{
printf("%d\t", (p + i)[0]); //这个写法很少
//p+i
//p+0 等效&array[0];
//p+1 等效&array[1];
}
printf("\n");
//p++ p=p+1
//++p p=p+1
printf("%d\n", *p++); //打印1后,p做++ p等于&array[1];
printf("%d\n", *++p); //先改变p的值,p等于&array[2],*p: 3
//不常用的一级指针操作一维数组
int* pp = &array[0]; //1
pp[0]--; //0
array[0]--; //-1
printf("%d\n", pp[0]);
(*pp)--; //*pp 等效变量pp[0] 等效array[0];
printf("%d\n", pp[0]);
//注意细节: (*pp)-- *p-- 是不同的两种东西
//没有括号--是作用在指针上的, 有括号,--作用在指针表示的变量上
//++ 也是同理的,并且无论前置或者后置都是一样的。
char str[] = { "ABCDEFG" };
char* pstr = &str[2];
//char* pstr=str+2; 和上面这句话等效
printf("%c\n", pstr[0]); //C
printf("%c\n", pstr[-1]); //pstr[-1] 等效 *(pstr-1)
pstr++;
puts(pstr);
//只有当两个指针指向同一个数组,做减法才有实质含义
char* p1 = &str[0];
char* p2 = &str[6];
printf("%d\n", p2 - p1);
//str++;
return 0;
}
万能指针
- 可以被任何类型的地址赋值
- 在使用前必须做强制类型转换
- 所谓的使用前(通过这个指针访问数据,或者调用函数)
#include <stdio.h>
#include <stdlib.h>
int main()
{
int array[] = { 1,3,5 };
int* p = array;
int* pp = &array[0];
*++p; //++先和p做运算 ,++p ,p=p+1 做*运算前,p的值是&array[1]
//*++p 等效 *(&array[1]);
printf("%d\n", *p); //3
++(*pp);
//*pp等效pp[0] 等效array[0], ++pp[0] 等效++array[0];
printf("%d\n", *pp); //2
//写程序是要避免写这种模棱两可的代码的。
//万能指针: 空类型的指针 void*
void* pVoid = NULL;
int iNum = 1001;
pVoid = &iNum;
printf("%d\n", *(int *)pVoid);
double dNum = 1.11;
pVoid = &dNum;
printf("%lf\n", *(double *)pVoid);
//int* p = (int*)malloc(sizeof(int));
return 0;
}
指针操作字符串
#include <stdio.h>
int mystrlen(char* str)
{
int count = 0;
while (*str++ != '\0')
{
count++;
}
return count;
}
void insertChar(char* str, char cNum)
{
int count = 0;
while (*str++ != '\0')
{
count++;
}
//printf("count=%d\n", count);
str = str - 2;
while (*str > cNum)
{
*(str + 1) = *str;
str--;
}
*++str = cNum;
}
int main()
{
char str[20] = { "ILYE" };
printf("%d\n", mystrlen(str));
char sortStr[20] = { "ABDEF" }; //ABDEF\0
insertChar(sortStr, 'C');
puts(sortStr);
return 0;
}
本文来自博客园,作者:{oy},转载请注明原文链接:https://www.cnblogs.com/Oysen/p/17005609.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)