天天看点

C语言指针学习笔记指针连续定义数组和指针都可以使用下标运算符下标运算符可以是负数指针的指针

指针连续定义

指针连续定义必须每个都要带上*

正确定义:
int *i, *j;
相当于
int *i;
int *j;

错误定义:
ini *i, j;
相当于
int *i;
int j;
           

数组和指针都可以使用下标运算符

因为数组也是指针

int a[] = {1,2,3};
int *aa = a;
printf("a[0] = %d ; aa[0] = %d",a[0], aa[0]);
// 输出结果a[0] 和 aa[0] 相等
           
/*使用下标实现的例子*/
int a[10];
int i;
for(i = 0; i < 10; i++){
	a[i] = 0;
}

/*使用指针实现的例子*/
int a[10];
int *pa;
for( pa = a; pa < (a + 10); pa++ ){
	*pa = 0;
}
           

下标运算符可以是负数

[-n] 指前n个地址,但会产生警告

int a[] = {0,1,2,3};
int *b = &a[2];
printf("b[-1] = %d",b[-1]);
// 输出结果 b[-1] = 1
           

指针的指针

指向指针的指针,即二级指针

int b = 2;
int *bp = &b; // bp 是 b 的指针
int **bpp = &bp; // bbp 是 bp 的指针
printf("b %d\n",b);  // b 2
printf("&b %p\n",&b); // &b 0x16ce9f728 (b的地址)

printf("bp %p\n",bp); // bp 0x16ce9f728 (bp的值就是b的地址)
printf("*bp %d\n", *bp); // *bp 2 (对bp取值就是b的值)
printf("&bp %p\n", &bp); // &bp 0x16ce9f720 (bp的地址)
printf("&*bp %d\n", &*bp); // &*bp 0x16b9ef728 (&*、*&我也不知道怎么理解,只知道作用是相互抵消,相当于bp)
printf("*&bp %p\n", *&bp); // *&bp 0x16b9ef728(相互抵消,相当于bp)

printf("bpp %p\n", bpp); // bpp 0x16ce9f720 (bpp的值就是bp的地址)
printf("*bpp %p\n", *bpp); // *bpp 0x16ce9f728 (对bpp取值就是bp的值,也就是b的地址)
printf("**bpp %d\n", **bpp); // **bpp 2 (对*bpp取值就是对bp的值取值,也就是b的值)
printf("&bpp %p\n", &bpp); // &bpp 0x16ce9f718 (bpp的地址)
printf("&*bpp %p\n", &*bpp); // &*bpp 0x16ce9f720 (相互抵消,相当于bpp)
printf("*&bpp %p\n", *&bpp); // *&bpp 0x16ce9f720 (相互抵消,相当于bpp)

           

继续阅读