目录
十、指针
10.1了解指针
指针:是变量 ,存储地址编号的。
地址:内存按照 字节 进行编号,1个字节1个编号 4GB
一般地址编号用16进制表示 %p
空间:指针本身的空间 指针指向的空间
10.2指针使用
10.2.1指针定义:
指针类型 指针名;
指针类型:指针指向对象的类型 *
指针定义的时候:* -- 是指针的标记
例子:
定义一个指针指向int型的空间,保存int型的地址。
int * p; // int *p; int* p;
// 定义一个变量,变量名: p
定义一个指针指向double型空间,
double * q;
10.2.2指针读写操作:
练习1、定义一个指针指向int型的空间,保存int型的地址。
int a = 30; // int型的空间 -- int型的地址 -- &a
定义一个指针指向a ,保存a的地址。
int * p;
// 指针指向a ,保存a的地址
p = &a; // p -- 指针本身的空间 *p --- 解地址 -- 指针指向的空间
#include<stdio.h>
int main (void)
{
int a = 30;
int* p;
p = &a;
printf ("%p %p\n", p, &a);
printf ("%d %d\n", *p, a);
*p = 100;
printf ("%d %d\n", *p, a);
return 0;
}
10.2.3指针变量空间大小
4/8 个字节, 32位系统 -4个字节 64位系统 -- 8个字节 指针变量空间大小和指向对象类型没有系,
实质: 指针存地址编号的。
#include<stdio.h>
int main (void)
{
int* p;
char* q;
double* temp;
int (*k)[3];
printf ("%d %d %d %d\n", sizeof (p), sizeof (q), sizeof (temp), sizeof (k)); // 4 / 8
printf ("%d %d %d %d\n", sizeof (*p), sizeof (*q), sizeof (*temp), sizeof (*k)); // 4 1 8 12
return 0;
}
10.2.4指针偏移:
指针偏移和指针指向的对象类型有关,就以指针指向的对象类型为单位进行偏移。
指针指向数组里面的数据进行偏移。
地址是常量 , 指针是变量,存储地址编号的。
int a[5] = { 5,78,9,100,34 };
// 定义一个指针,指向数组里面的元素a[0],然后再进行偏移
int* p;
// p指向a[0],保存a[0]的地址
p = a; // p = &a[0];
printf ("%p %p\n", p, p + 1); //
----------------------------------------------------------------
char arr[] = { '2','4','5','6' };
// 定义一个指针,指向数组里面的元素arr[2],然后再进行偏移
char* q;
// q指向arr[2]
q = arr + 2; // arr + 2 === &arr[2]
printf ("%p %p %p\n", q - 1, q, q + 1);
#include<stdio.h>
int main (void)
{
int a[5] = { 5,78,9,100,34 };
// 定义一个指针,指向数组里面的元素a[0],然后再进行偏移
int* p;
// p指向a[0],保存a[0]的地址
p = a; // p = &a[0];
printf ("%p %p\n", p, p + 1); // 偏移 - 4个字节
printf ("%p %p\n", &a[0], &a[0] + 1);
char arr[] = { '2','4','5','6' };
// 定义一个指针,指向数组里面的元素arr[2],然后再进行偏移
char* q;
// q指向arr[2]
q = arr + 2; // arr + 2 === &arr[2]
printf ("%p %p %p\n", q - 1, q, q + 1); // 偏移-- 1个字节
return 0;
}
练习:倒转数组,用指针的方式
#include<stdio.h>
main ()
{
int a[] = { 10,9,8,7,6,5,4,3,2,1,0, };
//定义指针指向首元素和尾元素
int* first = a;
int* last = &a[10];
//定义中间变量用于交换
int temp;
//开始交换
do
{
temp = *first;
*first = *last;
*last = temp;
} while (++first <= --last);
//输出检验
int i = 0;
for (i = 0; i < 11; i++)
{
printf ("%d ", a[i]);
}
return 0;
}