目录
十、指针
10.1了解指针
10.2指针使用
10.2.1指针定义:
10.2.2指针读写操作:
10.2.3指针变量空间大小
10.2.4指针偏移:
十、指针
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 / 8printf ("%d %d %d %d\n", sizeof (*p), sizeof (*q), sizeof (*temp), sizeof (*k)); // 4 1 8 12return 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;
}