mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4mobile wallpaper 5mobile wallpaper 6mobile wallpaper 7
129 字
1 分钟
指针进阶
2026-07-12

一、指针基础操作#

1.1 间接寻址#

#include <stdio.h>
int main()
{
int a = 100, b = 10;
int *p1, *p2;
p1 = &a;
p2 = &b;
printf("%p, %d\n", &a, b);
printf("%p, %d", &p1, *p2);
}

1.2 指针求最大值#

#include <stdio.h>
int main()
{
int *p1, *p2, *p, a, b;
scanf("%d,%d", &a, &b);
p1 = &a;
p2 = &b;
if (a < b)
{
p = p1;
p1 = p2;
p2 = p;
}
printf("a=%d,b=%d\n", a, b);
printf("max=%d,min=%d\n", *p1, *p2);
}

1.3 指针排序(三个数由小到大)#

#include <stdio.h>
int main()
{
int a, b, c, t;
int i, *p = &i;
int *p1 = &a, *p2 = &b, *p3 = &c;
scanf("%d,%d,%d", &a, &b, &c);
if (*p1 > *p2)
{
t = *p1;
*p1 = *p2;
*p2 = t;
}
if (*p1 > *p3)
{
t = *p1;
*p1 = *p3;
*p3 = t;
}
if (*p2 > *p3)
{
t = *p2;
*p2 = *p3;
*p3 = t;
}
printf("%d,%d,%d\n", *p1, *p2, *p3);
}

二、值传递与地址传递#

2.1 值传递(无法交换)#

#include <stdio.h>
swap(int x, int y)
{
int t;
t = x;
x = y;
y = t;
}
int main()
{
int a, b;
int *pa, *pb;
scanf("%d,%d", &a, &b);
pa = &a;
pb = &b;
if (a < b)
swap(*pa, *pb);
printf("\n%d,%d\n", a, b);
}

2.2 地址传递(交换指针本身,无法交换值)#

#include <stdio.h>
swap(int *p1, int *p2)
{
int *p;
p = p1;
p1 = p2;
p2 = p;
}
int main()
{
int a, b;
int *pa, *pb;
scanf("%d,%d", &a, &b);
pa = &a;
pb = &b;
if (a < b)
swap(pa, pb);
printf("%d,%d", *pa, *pb);
}

2.3 地址传递(交换指针指向的值,正确方式)#

#include <stdio.h>
swap(int *p1, int *p2)
{
int t;
t = *p1;
*p1 = *p2;
*p2 = t;
}
int main()
{
int a, b;
int *pa, *pb;
scanf("%d,%d", &a, &b);
pa = &a;
pb = &b;
if (a < b)
swap(pa, pb);
printf("\n%d,%d\n", a, b);
}

三、指针与数组#

3.1 指针操作二维数组#

#include<stdio.h>
#define M 3
#define N 4
void InputArray(int (*a)[N], int m, int n)
{
int i, j;
for(i = 0; i < m; i++)
{
for(j = 0; j < n; j++)
{
scanf("%d", &(*(*(a+i)+j)));
}
}
}
void PrintArray(int (*a)[N], int m, int n)
{
int i, j;
for(i = 0; i < m; i++)
{
for(j = 0; j < n; j++)
{
printf("%d ", *(*(a+i)+j));
}
printf("\n");
}
}
int main()
{
int a[M][N] = {1,2,3,4,5,6,7,8,9,10,11,12};
InputArray(a, M, N);
PrintArray(a, M, N);
return 0;
}

四、命令行参数#

#include<stdio.h>
int main(int argc, char *argv[])
{
int k;
for(k = 1; k < argc; k++)
printf("%s ", argv[k]);
printf("\n");
return 0;
}

五、动态内存分配#

5.1 动态数组#

#include<stdio.h>
#include <stdlib.h>
int main()
{
int n, sum, i, *p;
printf("Enter n: ");
scanf("%d", &n);
if ((p = (int*)malloc(n * sizeof(int))) == NULL) {
printf("Not able to allocate memory.\n");
exit(1);
}
printf("Enter %d integers: ", n);
for (i = 0; i < n; i++){
scanf("%d", p+i);
}
sum = 0;
for (i = 0; i < n; i++){
sum = sum + *(p+i);
}
printf("The sum is %d\n", sum);
free(p);
return 0;
}
分享

如果这篇文章对你有帮助,欢迎分享给更多人!

指针进阶
https://blog.radarweb.top/posts/c/指针进阶/
作者
Sherry
发布于
2026-07-12
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录