概述
- 指针的相关概念
什么是地址?
地址是操作系统给给每个存储单元分配的编号,32位的从0x00 00 00 00---0xff ff ff ff。
指针的大小也就是4个字节或八个字节组成(与指针的类型无关)
原理:指针的大小只由编译器决定,比如32位系统,指针为4个字节大小;而64位系统中指针大小为8个字节。
#include <stdio.h>
int main()
{
int a[3][5] = { 0,1,2,3,4,5,6 };
int* p;
printf("%p,%d",*a,sizeof(p));
return 0;
}//64位编译器
指针与地址的关系(自我理解)
指针变量存放的是地址编号,通过*操作符来对该地址编号对应的内存单元进行取值操作。
指针的大小由编译器决定,为4或8个字节,而一个内存单元的大小为1个字节,1个内存单元对应一个地址编号。所以32位中一个指针占据4个内存单元大小。指针也是有地址编号的,因为其在内存中开辟一块4个字节大小的连续空间来存放地址编号。
指针类型:char * int * double* float*(指针的大小与类型无关)
#include <stdio.h>
int main()
{
int* a;
char* b;
double* c;
float* d;
printf("%dn",sizeof(a));
printf("%dn",sizeof(b) );
printf("%dn", sizeof(c));
printf("%dn", sizeof(d));
return 0;
}
指针类型的作用:
指针类型决定解引用时访问几个字节;一个int类型指针就直接访问4给字节的空间,一个char类型就只能访问一个空间的内存等等
指针类型决定了指针向前一步或向后一步能走多远的距离。就比如说int类型的指针加一个单位就相当于走了四个字节的空间。
指针与指针相减:得到的是之间元素的个数
1.指针不适合做加法运算,一般用于减法运算
2.指针做减法运算时,一定要指向同一个数组,相减结果是两个指针之间的元素的数目,而不是两个指针之间相差的字节数
指针与数组
C语言规定一维数组的数组名就是地址,是固定的不允许改变的。
sizeof(数组名)--------计算整个数组的大小。
&数组名-------取址符+数组名代表取出的是整个数组的地址。
一维数组的数组名表示的是一维数组首个元素的地址---相当于列指针,指向的是元素的地址
二维数组的数组名表示的是首行的地址---相当于行指针,指向的是二维数组首行的地址。
#include <stdio.h>
int main()
{
int a[2][3] = {1,2,3,4,5,6};//定义一个二维数组
int(*p)[3] = a;//将第一行的地址放入数组指针p中
int* q =& a[0][0];//将首元素地址放入指针q中
printf("%p %pn",p, q);//第一行地址的起始位置指向的是首元素的地址
printf("%p %p %pn", p + 1, q + 1,&a[1][0]);//p+1指向下一行的地址,q+1指向下一个元素地址
return 0;
}
二维数组的降级问题:
指针和函数
当函数传地址时,用指针接收。
#include <stdio.h>
void change_num(int *p,int *q)//使用指针p和q对啊a,b的地址进行接收
{
int temp = 0;
temp = *p;
*p = *q;
*q = temp;
}
int main()
{
int a = 25, b = 52;
printf("a=%d,b=%dn", a, b);
change_num(&a,&b);//将a和b的地址传过去
printf("a=%d,b=%dn", a, b);
return 0;
}
函数传值时,调用函数结束,形参的改变无法影响实参。
数组传参----二维数组传参----数组指针接收
#include <stdio.h>
void fun(int (*p)[3])
{
int i = 0;
int j = 0;
for(i=0;i<2;i++)
{
for (j = 0; j < 3; j++)
{
printf("%dn", p[i][j]);
}
}
}
int main()
{
int a[2][3] = { 1,2,3,4,5,6 };
fun(a);
return 0;
}//打印123456
最后
以上就是孝顺芝麻为你收集整理的C语言---指针知识点(1)的全部内容,希望文章能够帮你解决C语言---指针知识点(1)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复