1 指针就是地址,地址就是指针
地址就是内存单元的编号
指针变量是存放地址的变量
指针和指针变量是两个不同的概念
但是要注意: 通常我们叙述时会把指针变量简称为指针,实际它们含义并不一样
2 关于形参传递,例如下面这两个函数
void test(int *arr)
void test(int arr[])
作为形参时,传递的无论是数组还是指针,其本质传递的都是一个指针,所以说上面两个函数是一样的。
3
void main() { int i=10;
int *p; //p是变量的名字, int * 表示p变量存放的是int类型变量的地址 *p=i;//错误
p=&i; //正确 }
上述中*p=i;和p=&i;对于编程的人来说都是想把i的地址给p,但第一句是错的
因为你只是把i的值给*p,但是关于他的地址p是多少还是不确定的,这句话只是在未知的一个地址上写了一个值,这个值是10,当然编译器会给出警告,运行时会导致程序奔溃。
而p=&i,则是把i的地址给了p,p指向了i,当然,此时*p就等于i,等于10.
4
1 void test(char *arr) 2 { 3 char *p=arr; 4 }
同理,对上面这个函数的理解,传进来一个指针参数,把他赋值给p,即 p=arr,因为数据类型是char *
而不是*p=arr。
5 对于互换两个数的理解
1 int main(void) 2 { 3 int a = 3; 4 int b = 5; 5 6 huhuan_3(&a, &b); //huhuan_2(*p, *q); 是错误的, 7 printf("a = %d, b = %d ", a, b); 8 9 return 0; 10 } 11 12 void huhuan_3(int * p, int * q) 13 { 14 int t; 15 16 t = *p; //p是int *, *p是int 17 *p = *q; 18 *q = t; 19 }
对于互换函数的理解,
1 t=*p,即t=a=3.
2 *p=*q, 表示在地址为p的地方写入1个数,这个数是*q,即b,而p就是a的地址,所以a=5
(上面的说法严格上说是不准确的,因为
P不是地址,P是一个变量,里面存放的是地址,正确的理解是
表示指针变量P里面存放地址所对应的内存单元 写入 1 ,但通俗的按上面理解就可以了。
)
3 *q=t, 表示在地址为q的地方写入1个数,这个数为t,即3,而q就是b的地址,所以b=3
经过上面几步,把a,b对应的地址上的数改变掉了,所以a和b发生了改变