1、 指针是什么?
指针表示变量的地址,例如ptr=& pooh,其中&取地址符取出pooh变量的地址然后赋值给ptr,此时ptr可看成指针变量,指向pooh变量
2、指针变量的声明和赋值
int *pi
char *pc
float *pf
3、指针变量的大小
指针变量的大小取决于操作系统和编译器的架构,而不是它所指向的数据类型
| 平台架构 | 指针大小 |
| 32位系统 (x86) | 4字节 |
| 64位系统 (x86_64) | 8字节 |
1° 在 64 位系统上,int 通常是 4 字节,但 int * 是 8 字节
4、取地址运算符 和 解引用运算符
(1)取地址运算符&取出变量地址,例如:
#include <stdio.h>
int main(void)
{
int age;
printf("Please input your age");
scanf("%d",&age);
printf("%d",age);
return 0;
}
(2)解引用运算符*,例如:
#include <stdio.h>
int main(void)
{
int age;
int *pointer1;
printf("Please input your age\n");
scanf("%d", &age);
pointer1 = &age;
printf("%d", *pointer1);
return 0;
}
5. 利用指针实现交换函数的问题(形参地址传递)
#include <stdio.h>
void intExchange(int* m, int* n);
int main(void)
{
int x = 10;
int y = 20;
int* pointer1 = &x;
int* pointer2 = &y;
intExchange(pointer1, pointer2);
printf("%d\n%d\n", *pointer1, *pointer2);
}
void intExchange(int* m, int* n)
{
int temp;
temp = *m;
*m = *n;
*n = temp;
}
5、数组和指针
(1)数组名是数组首元素的地址,例如数组array的数组名 array==&array[0]
(2)在C语言中,指针+1表示的是增加指针类型对应的字节数
#include <stdio.h>
int main(void)
{
int array[10];
printf("array数组的首元素地址为:%p\n", array); //数组首元素的地址值
printf("array数组的首元素地址为:%p\n", &array[0]); //数组首元素的地址值
printf("array数组的第二个元素的地址为 :%p\n", array + 1); //数组第二个元素的地址值
printf("array数组的第二个元素的地址为 :%p\n", &array[1]); //数组第二个元素的地址值
}
(3)数组中,指针的解引用符
*(array+1)=array[1] //表示第二个数组元素的值
*array + 1 //表示第一个数组元素值+1
(4)array , &array[0] 和 &array
| arr | int* | 首元素地址 | array + 1 增加4个字节,表示array[1] |
| &arr[0] | int* | 首元素地址 | 同上 |
| &arr | int (*)[5] | 整个数组的地址 | &arr + 1 增加20个字节,表示数组之后的内存 |
(5)指针数组和数组指针
| 特性 | (指针数组) | |
|---|---|---|
| 声明形式 | int* arr1[10] |
int (*arr2)[10] |
| 本质 | 数组(10个元素) | 指针(1个变量) |
| sizeof | 10 * sizeof(int*) = 80字节(64位) |
sizeof(int*) = 8字节 |
| 元素类型 | int* |
int[10] |
| arr[i]的类型 | int* |
int[10](可再 [j] 下标访问) |
| +1跳跃 | 跳8字节(下一个指针) | 跳40字节(下一个10-int数组) |
| 初始化 | 需10个int*地址 |
需int[x][10]的地址 |
6、函数,数组和指针
一维数组array退化为首元素地址
#include <stdio.h>
int sum(int *num, int n); //声明sum函数时,括号内声明指针形参num和变量n
int main(void)
{
int array[10] = {0,1,2,3,4,5,6,7,8,9};
int total;
total = sum(array, 10); //调用sum函数时,括号内给出数组首元素地址,和常量
printf("数组各元素和为%d", total);
}
int sum(int* array, int n)
{
int i=0;
int total=0;
for (i = 0; i < n; i++)
{
total = total + array[i]; // 这里array[i] 等价于 *[array+i]
}
return total;
}
二维数组matrix退化为第一行数组地址
#include <stdio.h>
// 参数:指向包含5个int的数组的指针,行数
int sum(int (*array)[5], int rows)
{
int total = 0;
// 双重循环遍历
for (int i = 0; i < rows; i++) {
for (int j = 0; j < 5; j++) {
total += array[i][j]; // 或使用 *(*(array+i)+j)
}
}
return total;
}
int main(void)
{
int matrix[3][5] = {
{0, 1, 2, 3, 4},
{5, 6, 7, 8, 9},
{10, 11, 12, 13, 14}
};
int total = sum(matrix, 3); // matrix退化为 int(*)[5]
printf("二维数组各元素和为: %d\n", total); // 输出: 105
return 0;
}
7. 指针和字符串
#include <stdio.h>
int main() {
const char* mesg = "Think different";
const char* copy;
copy = mesg;
printf("%d\n", *mesg);//表示指针指向的内容
printf("%d\n", *copy);
printf("%d\n\n", 'T');
printf("%p\n", mesg);//表示指针的值
printf("%p\n\n", copy);
printf("%p\n", &mesg);//表示指针的存储地址
printf("%p\n", ©);
}
浙公网安备 33010602011771号