【小黑chenchen】:8指针基础

发布于:2022-11-14 ⋅ 阅读:(740) ⋅ 点赞:(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++相当于*(p++),即*(p=p+1),C语言中*和++是同级操作符。       

{                                       // 指针指向的改变:指针本身指向前面/后面一个“基类型”的内存,

                                        // 改变指针p指向的地址编号。

putchar('\n');

for(int i=0;i<10;i++)

{

        printf("%d\t",(*p)++); // 指针p指向的地址数据+1。

}

putchar('\n');

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

网站公告

今日签到

点亮在社区的每一天
去签到