cy语言之指针3

指针是一个变量,它存储的是另一个变量的内存地址,而不是数据本身。通过指针可以间接访问和修改它所指向的变量。

数据类型 *指针变量名;

  • 数据类型:指针所指向的变量的类型(如 intcharfloat 等)。

  • *:表示这是一个指针变量。

  • 指针变量名:符合C语言命名规则的标识符。

int *p; // 定义一个指向 int 类型变量的指针 p

char *q; // 定义一个指向 char 类型变量的指针 q

float *r; // 定义一个指向 float 类型变量的指针 r

关键操作符

  • 取地址运算符 &:获取一个变量的内存地址。

  • 解引用运算符 *:访问指针所指向地址中存储的值。

%p:地址格式说明符(以十六进制打印指针中存储的地址值。)

虽然%d也能打印地址但是会报警,虽然不会报错,如下:

注意事项

  • 指针必须初始化,否则指向未知地址(野指针),可能导致程序崩溃。

  • 不能对未分配有效地址的指针解引用。

  • 指针本身也有地址,可以定义指向指针的指针(二级指针)。

指针数组:

指针数组是指一个数组,其中的每个元素都是一个指针变量。它常用于存储多个地址(例如多个字符串、多个数组的起始地址等)。

数据类型 *数组名[数组长度];

  • 数据类型:指针所指向的数据类型。

  • *:表示数组元素是指针。

  • 数组名:标识符。

  • 数组长度:元素个数。

p+i == &arr[i]

*(p + i)) == *(arr+i) == arr[i]

指针p通过加减1,来访问地址的值。

数组的值是通过下标也是索引来进行访问的。

数组就是数组,是一块连续的空间(数组的大熊啊和数组元素的个数和元素类型都有关系。)

指针(变量)就是指针(变量),是一个变量(4/8个字节)

数组名是地址,是首元素的地址

可以使用指针来访问数组

arr[i] == *(arr+i) == *(i+arr) == i[arr]

\] 下标引用符 相当于 加减 1+2 == 2+1 ,所以arr\[i\]==i\[arr\],但是一般都默认写为arr\[i\]. ![](https://i-blog.csdnimg.cn/direct/d45936f491584275b0134766c1aca1b0.png) 数组传参的本质是传递了数组首元素的地址,所以形参访问的数组和实参的数组是同一个数组的。 形参的数组是不会单独在创建数组空间的,所以形参的数组是可以省略掉数组大小的。 正确写法如下: ![](https://i-blog.csdnimg.cn/direct/28f60ddceb9b4f9fbab2808c50b59c7a.png) ```cs #include void Print(int* p, int sz) { int i = 0; for (i = 0; i < sz; i++) { printf("%d ", *(p + i)); } } int main() { int arr[5] = { 1,2,3,4,5 }; int sz = sizeof(arr) / sizeof(arr[0]); Print(arr,sz);//arr数组名就是数组首元素的地址。 return 0; } ``` ## 冒泡排序 冒泡排序的核⼼思想就是:两两相邻的元素进⾏⽐较。 ![](https://i-blog.csdnimg.cn/direct/f383fbf3a50c4a06a4bd5047ac666c5f.png) ```cs #include void bubble_sort(int arr[], int sz)//参数接收数组元素个数 { int i = 0; for (i = 0; i < sz - 1; i++)//5个数,进行4次排序 { int j = 0; for (j = 0; j < sz - i - 1; j++)//每一次排序确定一个数。 { if (arr[j] > arr[j + 1]) { int tmp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = tmp; } } } } int main() { int arr[] = { 3,1,7,5,8,9,0,2,4,6 }; int sz = sizeof(arr) / sizeof(arr[0]); bubble_sort(arr, sz); for (int i = 0; i < sz; i++) { printf("%d ", arr[i]); } return 0; } ``` ![](https://i-blog.csdnimg.cn/direct/c868525d1b20442ba3ddf8696a48b853.png) ```cs //⽅法2 - 优化 void bubble_sort(int arr[], int sz)//参数接收数组元素个数 { int i = 0; for (i = 0; i < sz - 1; i++) { int flag = 1;//假设这⼀趟已经有序了 int j = 0; for (j = 0; j < sz - i - 1; j++) { if (arr[j] > arr[j + 1]) { flag = 0;//发⽣交换就说明,⽆序 int tmp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = tmp; } } if (flag == 1)//这⼀趟没交换就说明已经有序,后续⽆序排序了 break; } } int main() { int arr[] = { 3,1,7,5,8,9,0,2,4,6 }; int sz = sizeof(arr) / sizeof(arr[0]); bubble_sort(arr, sz); for (int i = 0; i < sz; i++) { printf("%d ", arr[i]); } return 0; } ``` ## ⼆级指针 指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪⾥? ![](https://i-blog.csdnimg.cn/direct/3e5265063479444e9d180ad8bda47c87.png) \&a:变量a的地址 0x100 p:指针p的值(存的就是\&a)0x100 \*p:就是值 10,因为p指向的是a的地址,\*p解引用后就得到了值。 \*pp :取pp指向的内容,就是p的值 0x100 pp指向的是p,所以\*pp就是解引用得到pp所指向的值,是p,而p是地址,想要得到数值,必须在解引用一次。 pp: 指针pp自己的地址 0x200 \*\*pp:两次解引用,得到a值。,此代码中把%p改为%d,就可得到10。 就相当于你想睡觉,得先进大门,在进卧室门,才能睡觉,而大门是pp,卧室门是p,睡觉是a,那么你在大门第一次解引用,得到的是你卧室门的地址,第二次解引用你才能睡觉;如果你直接在卧室门,那么你只需要解引用一次,就可以睡觉了。 ## 指针数组模拟⼆维数组 ```cs #include int main() { int arr1[] = {1,2,3,4,5}; int arr2[] = {2,3,4,5,6}; int arr3[] = {3,4,5,6,7}; //数组名是数组⾸元素的地址,类型是int*的,就可以存放在parr数组中 int* parr[3] = {arr1, arr2, arr3}; int i = 0; int j = 0; for(i=0; i<3; i++) { for(j=0; j<5; j++) { printf("%d ", parr[i][j]); } printf("\n"); } return 0; } ``` ![](https://i-blog.csdnimg.cn/direct/fd7693a66e3a4bc296ffc5c15e440ee9.png) ![](https://i-blog.csdnimg.cn/direct/521397f65cf34d1fbd1be0409fdbd878.png) parr\[i\]是访问parr数组的元素,parr\[i\]找到的数组元素指向了整型⼀维数组,parr\[i\]\[ j\]就是整型⼀维数组中的元素。 上述的代码模拟出⼆维数组的效果,实际上并⾮完全是⼆维数组,因为每⼀⾏并⾮是连续的。

相关推荐
木子墨5161 小时前
工程算法实战 | 数据库ORDER BY的底层:内存排序 → 外部归并 → 索引优化
数据结构·数据库·python·sql·算法·动态规划
鱼子星_2 小时前
【数据结构与算法】OJ题目详解(一)-单链表:从易到难的面试OJ题目
c语言·数据结构·算法·链表·面试·职场和发展
ulias2122 小时前
leetcode热题 - 7
数据结构·算法·leetcode
代码中介商2 小时前
树与二叉树:数据结构核心解析
数据结构
图码2 小时前
矩阵中的“对角线强迫症”:如何优雅地判断Toeplitz矩阵?
数据结构·c++·线性代数·算法·青少年编程·矩阵
玛卡巴卡ldf2 小时前
【LeetCode 手撕算法】(动态规划)爬楼梯、杨辉三角、打家劫舍、完全平方数、零钱兑换、单词拆分、最长递增子序列、乘积最大子数组、分割等和子集
java·数据结构·算法·leetcode·动态规划·力扣
图码2 小时前
矩阵边界遍历:顺时针与图案打印的两种高效解法
数据结构·python·线性代数·算法·青少年编程·矩阵·深度优先遍历
YL200404263 小时前
042将有序数组转换为二叉搜索树
数据结构·算法·leetcode
Dlrb12113 小时前
C语言-结构体
c语言·数据结构·结构体·内存对齐·结构体大小计算