元小白(猿小白)进阶日记:十五(指针)

一、指针
1、指针的读写基本单元为字节,指针变量内存的是其所指向变量的地址(编号)。
指针定义方式
类型名 * 指针变量名;
(类型也包括自定义类型,例如:结构体变量,数组变量,指针变量)
此指针变量 存放的是 此类型名类型 的变量 的地址

char *pc = NULL;//存放char型变量的地址
int  *pi = NULL;//存放int型变量的地址
short *ps = NULL;//存放shart型变量的地址
long *pl = NULL;
float *pf = NULL;
double *pd = NULL;

例如:

#include<stdio.h>
int main()
{
	int a = 10;
	int *p = &a;
	printf("%p\n", p);
	printf("%p\n", &a);
		return 0;
}

输出结果为012FFBA0,就是变量a 的地址

指向不同类型变量的指针大小在32位平台上是4个字节,在64位平台上是8个字节,因为指针变量中存放的都是变量的地址,通常用16进制数表示。

例如:

#include<stdio.h>
int main()
{
	int n = 10;
	char *pc = (char*)&n;//pc接受的是char型的n的地址,n的地址不变,但char型的变量占1个字节,所以pc+1会是地址+1;
	int * pi = &n;//pc接受的是int型的n的地址,n的地址不变,int型的变量占4个字节,所以pc+1会是地址+4;
	printf("%p\n", &n);// 006FF938
	printf("%p\n", pc );//006FF938
	printf("%p\n", pc+1);//006FF939
	printf("%p\n", pi);//006FF938
	printf("%p\n", pi+1);//006FF93C
	return 0;
}

指针的类型决定了指针向前或者向后走一步有多大距离。

#include<stdio.h>
int main()
{
	int n = 0x11223344;
	int *pi = &n;
	char *pc = (char *)&n;
	//*pc = 0x55;//输出结果是11223355,只是因为在此计算机中用的是小端编址,意思就是将数据中的低权位存放在低地址中,也就是变量n的首地址中存的是44。
				 //而且pc是char型,所以只能对其一个字节进行操作,即将44变为55
	*pi = 0;//输出结果为0,pi是Int型,所以是对n的四个字节进行操作
	printf("%0x\n", n);
	return 0;
}

指针的类型决定了对指针解引用时有多大的权限(能操作几个字节)

#include<stdio.h>
#define N_VALUES 5
int main()
{
	float values[N_VALUES];
	float* vp;
	for (vp = &values[0]; vp < &values[N_VALUES];)
	{
		*vp++ = 0;//将数组元素赋值0;
	}
	return 0;
}

允许指向数组元素的指针与指向数组的最后一个元素的后面的那个内存位置进行比较,但不允许与只想第一个元素之前的那个内存位置的指针进行比较,所以不建议用第二种赋值方法

 1、for (vp = &values[N_VALUES]; vp > &avlues[0])
    {
    	*--vp = 0;
    }
    
 

 2、 for (vp = &values[N_VALUES]; vp > &avlues[0];vp--)
        {
        	*vp = 0;
        }

 #include<stdio.h>
    int main()
    {
    	int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
    	printf("%p\n", arr);//0093FC28
    	printf("%p\n", &arr[0]);//0093FC28
    	return 0;
    }

意味着数组名在此代表着数组的首地址,即数组首元素的首地址
int * p=arr;//此语句成立;

#include<stdio.h>
int main()
{
	int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
	int* p = arr;
	int sz = sizeof(arr) / sizeof(arr[0]);//在sizeof中,数组名代表整个数组。
	for (int i = 0; i < sz; i++)
	{
		printf("arr[%d]=%d\n", i,arr[i]);
	}
	return 0;
}

通过下标访问数组元素

#include<stdio.h>
int main()
{
	int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
	int* p = arr;
	int sz = sizeof(arr) / sizeof(arr[0]);//在sizeof中,数组名代表整个数组。
	for (int i = 0; i < sz; i++)
	{
		printf("arr[%d]=%d\n", i,*(p+i));
	}
	return 0;
}

int * p;
p=10;//将p中存放的地址改为10;
相当于int* p=10;

二级指针
指针变量中存放的是另一个指针变量的地址
例如:

int a=8;
int * p=&a;
int* *p1=p;//p1中存放的是p的地址;

指针数组
数组中放的是指针型变量
例如:int* arr3[5];//指针数组,指针变量的集合

数组指针
int (*a)[5];//数组指针,指向数组的指针

注:以 int a[10] 为例;

1、数组中最后一个元素的地址只允许访问,不允许写入;

2、int a[10];
int* p=&a[0];
int*q =&a[9];
&a[9]-&a[0]=9;//结果是两元素中间的元素个数

3、数组名在sizeof中单独被操作时,代表整个数组

4、int a[10];
&a=a;//其数值一样,但意义不一样,a代表首元素首地址,&a代表数组的首元素首地址。 * (&a)解引用整个数组,,*a解引用首元素。

5、sizeof(a)//40,a在sizeof中单独作用,代表整个数组
sizeof(a+1)//4,代表a[1]的地址大小,32位平台均为4
printf("%p\n",a);//首元素地址
printf("%p\n",a+1);//a[1]的地址
printf("%p\n",&a+1);//会跳过整个数组到下一个数组的首地址

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
项目:使用AngularJs编写的简单 益智游戏(附源代码)  这是一个简单的 javascript 项目。这是一个拼图游戏,也包含一个填字游戏。这个游戏玩起来很棒。有两个不同的版本可以玩这个游戏。你也可以玩填字游戏。 关于游戏 这款游戏的玩法很简单。如上所述,它包含拼图和填字游戏。您可以通过移动图像来玩滑动拼图。您还可以选择要在滑动面板中拥有的列数和网格数。 另一个是填字游戏。在这里你只需要找到浏览器左侧提到的那些单词。 要运行此游戏,您需要在系统上安装浏览器。下载并在代码编辑器中打开此项目。然后有一个 index.html 文件可供您修改。在命令提示符中运行该文件,或者您可以直接运行索引文件。使用 Google Chrome 或 FireFox 可获得更好的用户体验。此外,这是一款多人游戏,双方玩家都是人类。 这个游戏包含很多 JavaScript 验证。这个游戏很有趣,如果你能用一点 CSS 修改它,那就更好了。 总的来说,这个项目使用了很多 javascript 和 javascript 库。如果你可以添加一些具有不同颜色选项的级别,那么你一定可以利用其库来提高你的 javascript 技能。 演示: 该项目为国外大神项目,可以作为毕业设计的项目,也可以作为大作业项目,不用担心代码重复,设计重复等,如果需要对项目进行修改,需要具备一定基础知识。 注意:如果装有360等杀毒软件,可能会出现误报的情况,源码本身并无病毒,使用源码时可以关闭360,或者添加信任。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值