C语言学习笔记(1):指针

C语言学习笔记(1):指针

  • 指针的概念
  • 指针的应用场景
    • 指针中最容易犯的错误
  • 数组变量是一种特殊的指针

指针的概念

指针是一个变量,是保存地址的变量,表示为
int* p,
int* p = &i,
注意*号与p相连,表示p指向i的地址,不是和int相连,如
int *p,q , 表示指针p和整型q

指针变量与普通变量的区别

  • 普通变量的值是实际的值
  • 指针变量的值是具有实际值变量的地址

作为参数的指针

  • void f(int *p);
  • 在被调用的时候得到了某个变量的地址
  • int i = 0,;f(&i);
  • 在函数里面可以通过这个指针访问外面的这个i

访问地址上的变量*

  • *是一个单目运算符,用来访问指针上的值所表示的地址上的变量
  • 可以作为左值也可以作为右值
  • int k = *p
  • *p = k+1
    注意: *p是一个值而不是一个变量

指针的运算符:&和*,二者是互为相反运算的关系,如:

&*ypte -> yptr
*&yptr->yptr

示例代码:

#include  
void f(int *p);
void g(int k);

int main(void)
{
	int i = 7;
	printf("i = %p\n", &i);
	g(i);
	f(&i);
	g(i);

	getchar();
	return 0;
}

void f(int *p)
{
	printf("p = %p\n", p);
	printf("*p = %d\n", *p);
	*p = 666;
}

void g(int k)
{
	printf("k = %d\n", k);
}

输出:
i = 00FAFACC
k=7
p = 00FAFACC
*p = 7
k = 666
*结果解释:*p不仅可以直接访问地址中的值,还可以通过赋值的方式改变地址中对应的值的大小

指针的应用场景

交换两个变量的值

  • 函数返回多个值,某些值只能通过指针返回
  • 传入的参数实际上是需要保存带会结果的变量

函数通过指针返回运算的状态

  • 常用的方法是让函数返回特殊的不属于有效范围的值来表示出错:
  • -1或0(在操作文件中会看到大量的例子)
  • 但当任何数值都是有效的结可能果时,就需要分开返回

指针中最容易犯的错误

定义了指针变量,还没有指向任何变量就开始使用指针

数组变量是一种特殊的指针

数组变量本身表达地址,所以无需用&取地址,但是数组的单元表达的是变量,需要用&取地址如:

int a[10];
int *p = a; //无需用&取地址
a == &a[0];//需要用&取地址
  • sizeof(a) == sizeof(int*)
  • 但是可以用数组的运算符[ ]进行运算
  • 运算符[]可以对数组做,也可以对指针做
  • 运算符*可以对指针做,也可以对数组做
  • 数组变量是const指针,所以不能被赋值
int a[] <==> int  * const a

以下这四种函数原型是等价的

  • int sum(int*ar, int n);
  • int sum(int *, int);
  • int sun(int ar[], int n);
  • int sum(int [], int);

你可能感兴趣的:(C语言笔记)