c语言中的指针入门

c与java之间最大的特征区别之一在于指针

对指针的理解:指针就是一个内存地址,是程序中数据在内存的存放位置。

实例引入

:现在假设我们需要写一个函数来将两个数的数值进行交换,
int a =5, b = 7;
//期望结果为a=7,b=5;
要求将要进行交换的两个数作为参数传入

  1. 当我们用java代码实现时
  2. 可能会想到按如下方式实现函数,比如
  3. swap(int x ,int y)
    {
    int temp;
    temp =x ;
    x = y;
    y = temp;
    }
    但这种方法其实最后不能得到预期结果,因为在java里这段函数里的参数相当于传值操作,
    当swap(a,b)时,只是相当于把a,b的值copy之后拿到函数里来用而已,而对于a,b本身值是没有改变的,当然也有其他比较复杂的方法实现。

c语言里指针入门理解

int n = 4;
double pi = 5;
int *pn = &n;
/*在声明的时候:声明啦一个int类型的指针pn,指向保存n的值的地址
int *作为一个整体部分理解,代表声明一个int类型的指针,不要将*和pn看作一体;
pn是声明指针的名字,是变量名;
&的含义是取地址的意思,相当于将n的地址给pn;
pn里保存的就是n的地址;
注意,指针的类型虽然不同,但指针的长度就是4个字节,可以理解为指针是存地址的,
而保存地址信息只需要四个字节,存的是变量的地址,
在同一架构下地址长度都是相同的(cpu的最大寻址内存空间)。
*/
double *ppi = π
理解同上
而在使用指针时,
*ppi
如果以上面的形式连在一起时,*可以理解成取值的意思,将ppi里的保存的值取出来
ppi单独使用时还是地址的意思。

借助程序判断大端法还是小端法来认识指针机制

大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址

c语言中的指针入门

int main()
{
	int a = 0x11223344;//首先定义一个数
	int *p = &a;//创建一个指针p来保存a的地址,其中p也代表a的首地址,也就是开始地址
	//定义成char类型
	char *ap = (char *)&a;//将原来int类型的指针变为char类型的指针
	for (int i = 0; i < 4; i++)
	{
		printf("%p ,%x\n", ap, *ap);//ap是指针,代表地址,*ap代表的含义是取地址里的值
		ap++;
	}
}

c语言中的指针入门

c语言实现数值交换

在了解指针的概念之后,我们使用c语言来实现数值交换,
void swap(int *x,int *y)
{
	 int temp = *x;
	 printf("%p, %d\n", x, *x);
	 *x = *y;
	 *y = temp;
}
int main()
{
	int a = 5, b = 7;
	swap(&a, &b);
	printf("%d\n,%d\n", a, b);
}
  1. 创建函数swap,参数为指针类型,当调用函数时
    内存中建立堆栈,里面保存着x,y,和temp的值,x和y的值分别为a,b
    的地址,如步骤1所示。
  2. 取x的值,即1010地址中寸的值,为5,将5(a)存入temp中
  3. 取x的值(地址1010里保存的内容),将其赋值为取y的值(地址1014里保存的内容)。
  4. 取y的值(地址1014里保存的内容),将其赋值为temp的值,即5.

c语言中的指针入门结合上课所听整理出的大致理解,如果有理解错误的地方欢迎指出,共同进步,谢谢