目录
地址:
地址:内存中一块用于存储数据的空间,这个空间的编号称为地址(内存地址编号)。
地址编号是一个常量,不可被改变,又称为地址常量。
每一次运行程序,变量的地址都会不同,操作系统会给变量随机分配不同的地址。
在运行过程中,变量的地址不可被改变,是一个地址常量。
取地址符&,用于取变量的地址
%p为地址的输出格式(十六进制)
指针变量:
专门用于保存内存地址编号的变量。
指针变量中存储的地址可以被改变。
■.指针变量的定义:
数据类型 *指针变量名;
例如,
int x=10;
int *p; // 定义了一个整型指针变量,指针变量名为p,
// int *p中的星号*此时是指针定义符,用于定义指针,
说明变量p是一个指针变量
p = &x; // 指针变量的赋值,将普通变量的地址赋值给指针变量,
// 指针变量用于保存其他变量的地址。
printf("%d\n",x); // 10 // 通过变量名直接访问变量的值。
printf("%d\n",*p); // 10 // 通过指针间接访问其所指向变量的值,
// *p中的星号*是“解引用”符号,用于得到指针
所指向地址中的值。
*p=20; // 通过指针解引用的方式间接改变变量的值,相当于
x=20;
// *p=*&x=x=20,星号*和取址符&相互抵消。
printf("%d\n",x); // 20
scanf("%d",&x); // 从键盘给变量x赋值
scanf("%d",p); // 从键盘给变量x赋值
int y=30;
p = &y, // 指针变量中存储的地址改变,指针变量的指向就随即改变
// 指针p原来指向变量x的地址,改变指向之后,就指向变量y
的地址
printf("%d\n",*p); // 30
----------
char ch ='a',*q=&ch; // 指针变量的初始化赋值(两步:定义+指向)
putchar(*q); // 解引用
putchar('\n');
printf("%d\n",sizeof(x)); // 4
printf("%d\n",sizeof(p)); // 4
printf("%d\n",sizeof(ch)); // 1
printf("%d\n",sizeof(q)); // 4
// 指针变量也有自己的存储空间,也就是说指针变量
有自己的地址 ,一般为四字节
printf("%p",&p); // 指针变量p的地址
printf("%p",&q); // 指针变量q的地址
指针和函数的运用:
指针变量作为函数参数进行传递,可以将地址传递到函数中,
使得函数形参可以通过解引用方式间接改变变量的值(实参也改变)。
即,地址传递。
例如,
void swap(int *x,int *y)
{
*x=*x+*y;
*y=*x-*y;
*x=*x-*y;
}
int main()
{
int a,b;
scanf("%d%d",&a,&b); // 若输入123 456
swap(&d,&b);
printf("%d\t%d\n",a,b); // 则输出456 123
return 0;
}
指针和数组的运用:
数组有自身的地址,我们可以用指针指向数组元素的地址,
从而通过指针间接访问数组元素的值。
例如,
int arr[]={1,2,3,4,5,6,7,8,9,0};
int *p=arr; 指针指向数组,相当于 int *p=arr[0];
数组名就代表数组的首地址,也就是数组中第一个元素的地址
for(int i=0;i<10,i++) 使用指针输出数组元素
{
printf("%d\t",p[i]); 用指针带下标的方式访问数组元素
} 数组下标[]类似于一次解引用
putchar('\n'); (数组下标自带解引用)
for(int i=0,i<10,i++)
{
prinf("%d\t",*(p+i)); 用指针解引用的方式访问数组元素
} 指针的偏移:指针使用时前面/后面
一个或多个"基类型"的内存
而指针本身的指向不改变。
for(int i=0;i<10;i++)
{
printf("%d\t",(*p)++); 指针p指向的地址数据+1。
}
putchar('\n');
for(int i=0;i<10;i++)
{
printf("%d\t",*p++); *p++相当于*(p++),即*(p=p+1),
C语言中*和++是同级操作符。
{ 指针指向的改变:指针本身指向前面/后面
putchar('\n'); 一个“基类型”的内存,
改变指针p指向的地址编号。
for(int i=0;i<10,i++)
{
pritnf("%d\t",p[i]); 数组下标越界
}
简言之,
#include<stdio.h>
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
int *p = arr;
for (int i = 0; i < 10;i++)
{
printf("%d\t", p[i]); //原数
}
putchar('\n');
for (int i = 0; i < 10;i++)
{
printf("%d\t", *(p + i)); //原数
}
putchar('\n');
for (int i = 0; i<10; i++)
{
printf("%d\t", *(p+i)+1); //原数+1
}
putchar('\n');
for (int i = 0; i < 10; i++)
{
printf("%d\t", *p++); //原数,指针指向改变
}
putchar('\n');
printf("%d\t",*p); //数组下标越界,乱码
return 0;
}
指针和字符串:
一般:指针指向整型、浮点型、字符型数据需两步(定义+指向)
特殊:通过指针指向字符串,可以直接使用字符串。
例如,
char str1[20]="abcdefg123456!@#";
puts(str1);
char *p="abcdefg123456!@#"; // 指针直接指向字符串。
puts(p); // 原样输出
printf("%d\n",sizeof(str1)); // 20
printf("%d\n",sizeof(p)); // 4 指针更加节省内存空间
str1[6]='_';
puts(str1); // 字符数组元素可以被改变
p[6]='_';
puts(p); // 字符串是一个字符串常量,常量的值无法被改变
—————————#
本文含有隐藏内容,请 开通VIP 后查看