【小黑chenchen】8话:指针基础

发布于:2023-02-17 ⋅ 阅读:(398) ⋅ 点赞:(0)

目录

地址:

指针变量:

指针和函数的运用:

指针和数组的运用:

指针和字符串:


地址:

地址:内存中一块用于存储数据的空间,这个空间的编号称为地址(内存地址编号)。

           地址编号是一个常量,不可被改变,又称为地址常量。

每一次运行程序,变量的地址都会不同,操作系统会给变量随机分配不同的地址。

在运行过程中,变量的地址不可被改变,是一个地址常量。
取地址符&,用于取变量的地址

%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 后查看