在学习指针之前,务必要搞清楚地址和指针的概念
假设程序已定义了3个整型变量i,j,k, 编译时系统分别分配四个字节给变量i, j,k。在程序中一般是通过变量名来对内存单元进行存取操作的。其实程序经过编译以后已经将变量名转换为变量的地址,对变量值的存取都是通过地址进行的。假如有输出语句:
printf ("%d",i);
它是这样执行的:根据变量名与地址的对应关系(这个对应关系是在编译时确定的),找到变量i的地址,然后从开始的四个字节中取出数据(即变量的值 3), 把它输出。
假如有输入语句:
scanf("%d", &j);
在执行时,把从键盘输入的值送到地址整型存储单元中。如果有语句:
k = i + j;
则从内存中取出i的值 (3), 再取出j的值 (6), 将它们相加后再将其和 (9) 送到k所占用的字节单元中。这种按变量地址存取变量值的方式称为“直接访问”方式。
还可以采用另一种称之为“间接访问”的方式,将变量的地址存放在另一个变量中。按C语言的规定,可以在程序中定义整型变量、实型变量、字符变量等,也可以定义这样一种特殊的变量,它是存放地址的。假设我们定义了一个变量 i_pointer, 用来存放整型变量的地址,它被分配四个字节。可以通过下面语句将i的地址存放i_pointer 中。
i_pointer = &i;
指针变量
语法:
基类型* 指针变量名;
基类型 --- 数据类型
//基本数据类型
//数组类型
//基类型 表示 指针变量 指向的目标的 数据类型
* --- 表示此时定义的变量是一个指针类型的变量
指针变量名 --- 标识符命名规则 + 见名知意
int * p; //表示定义了一个指针类型的变量p
int a = 10;
int *p = &a; //指针变量 p 指向 了 int型变量a
p变量的数据类型 int * //指针类型
在访问变量时,可以进行直接访问和间接访问,直接访问类似于
int a = 10;
而间接访问则是通过地址访问到的,其过程是:
1.首先拿出p指针变量中的值(地址) 到内存中定位
2.从定位处开始,偏移出sizeof(基类型)大小的一块空间
3.把这块空间当做一个 基类型的 变量来看
在一段程序中,如果被调函数想要修改主调函数:
1.想修改谁,就把谁的地址传过去
2.必须要做*运算(间接访问),实现修改
指针的运算:
1. &
2. *
3. p+1 //指向了下一个一基类型的数据
//跳过了一个基类型
4. p++
5. p-1
6. ---
关系运算
> >= < <= == !=
p>q
p-q
前提: 同一类型的指针
表示之间差了几个基类型
p+q //指针不能做加法运算
指针 + 数组
一维整型数组
int a[5]; //a首元素的地址
//a[0] -- int型
//&a[0] -- int *
int *p = &a[0];
= a;
const变量
表示为只读变量,不能改写
int puts(const char *s);
const char * s;
const int a; //只读变量
int a = 10;
const int *p = &a; //表示 基类型 为只读
p --- 指针变量 --本身的类型 int *
a --- int型变量 --本身类型 int
p = &a;
const int *p = &a;
int const *p = &a; //就近原则 -- 离谁近,就限定谁的
int *const p = &a; //限定p为只读
const int * const p = &a; //p不能被修改,指向的目标类型不能被修改
//(是不能通过*p)
int puts(const char *s)
{
}//const char *s --在函数里面 不能通过*s修改到外面的数据
好处:
1.可以接收 字符数组名 //char *
也可以接收 字符串常量 //const char *
提高了参数的适用性
2.避免了 可能出现的修改的操作
可以将 运行时的错误,提前到 编译时发现
const char * p 可以用来保存字符串常量的地址
今天写一道练习题
eg:"编写程序实现单词的倒置
"how are you" -> "you are how"
uoy era woh
you are how
#include<stdio.h>
#include<string.h>
void reverse_array(char *begin,char *end)
{
while(begin < end)
{
int temp = *begin;
*begin = *end;
*end = temp;
++begin;
--end;
}
}
void reverse_array_word(char *begin,char *end)
{
char *p = begin;
while(begin <= end)
{
if(*(begin + 1) == ' ' || *(begin + 1) == 0)
{
reverse_array(p,begin);
p = begin+2;
}
++begin;
}
}
int main(void)
{
char s[] = "how are you";
reverse_array(s,s + strlen(s)-1);
puts(s);
reverse_array_word(s,s + strlen(s) - 1);
puts(s);
return 0;
}
输出的结果为: