指针

指针是编程语言中的一个对象, 利用地址, 它的值直接指向存在电脑存储器中另一个地方的值

指针是个变量, 存放内存单元的地址

指针是用来存放地址的, 地址是唯一标识一块地址空间的

指针的大小在32位平台是4个字节, 在64位平台是8个字节

指针和指针类型

指针的类型决定了指针向前或者向后走一步有多大距离

字符指针

指针指向一个字符串时, 实际是将首字符地址存放在指针中

#include <stdio.h>

int main() {
	char str1[] = "hello";
	char str2[] = "hello";
	char *str3 = "hello";
	char *str4 = "hello";
	if (str1 == str2) {
		printf("str1 and str2 are same\n");
	}
	else {
		printf("str1 and str2 are not same\n");
	}
	if (str3 == str4) {
		printf("str3 and str4 are same\n");
	}
	else {
		printf("str3 and str4 are not same\n");
	}
	return 0;
}

04_指针

str3与str4指向的是同一个常量字符串, C/C++会把常量字符串存储到单独的一个内存区域, 当几个指针指向同一个字符串时他们实际会指向同一块内存

指针数组

指针数组是一个存放指针的数组

数组指针

数组指针是指向数组的指针

对于一个数组arr

  • &arr表示的是数组的地址, 而不是数组首元素的地址
  • &arr + 1会跳过整个数组的大小
  • arr + 1表示的是第二个元素的地址

数组参数/指针参数

二维数组传参

函数形参的设计只能省略第一个[]的数字

函数指针

函数指针数组

回调函数

  • 回调函数是通过函数指针调用的函数,
  • 把函数的指针作为参数传递给另一个函数, 当这个指针被用来调用其所指的函数时, 就是回调函数

练习

// 一维数组
int a[] = {1, 2, 3, 4};

printf("%d\n", sizeof(a));
// 16, 整个数组
printf("%d\n", sizeof(a + 0));
// 4, 首元素的地址
printf("%d\n", sizeof(*a));
// 4, 首元素
printf("%d\n", sizeof(a + 1));
// 4, 第二个元素的地址
printf("%d\n", sizeof(a[1]));
// 4, 第二个元素
printf("%d\n", sizeof(&a));
// 4, 整个数组的地址
printf("%d\n", sizeof(*&a));
// 16, 整个数组
printf("%d\n", sizeof(&a + 1));
// 4, 下一个数组的地址
printf("%d\n", sizeof(&a[0]));
// 4, 首元素的地址
printf("%d\n", sizeof(&a[0] + 1));
// 4, 第二个元素的地址

 

// 字符数组
char arr[] = {'a', 'b', 'c', 'd', 'e', 'f'};

printf("%d\n", sizeof(arr));
// 6, 整个数组
printf("%d\n", sizeof(arr + 0));
// 4, 首元素地址
printf("%d\n", sizeof(*arr));
// 1, 首元素
printf("%d\n", sizeof(arr[1]));
// 1, 第二个元素
printf("%d\n", sizeof(&arr));
// 4, 整个数组地址
printf("%d\n", sizeof(&arr + 1));
// 4, 下一个数组地址
printf("%d\n", sizeof(&arr[0] + 1));
// 4, 第二个元素地址
char *p = "abcdef";

printf("%d\n", sizeof(p)); 
// 4
printf("%d\n", sizeof(p+1)); 
// 4
printf("%d\n", sizeof(*p)); 
// 1
printf("%d\n", sizeof(p[0])); 
// 1
printf("%d\n", sizeof(&p)); 
// 4
printf("%d\n", sizeof(&p+1)); 
// 4
printf("%d\n", sizeof(&p[0]+1));
// 4

printf("%d\n", strlen(p)); 
// 6
printf("%d\n", strlen(p+1)); 
// 5
printf("%d\n", strlen(*p));
// ERROR
printf("%d\n", strlen(p[0])); 
// ERROR
printf("%d\n", strlen(&p)); 
// ERROR
printf("%d\n", strlen(&p+1));
// ERROR
printf("%d\n", strlen(&p[0]+1));
// 5
// 二维数组
int a[3][4] = {0}; 

printf("%d\n", sizeof(a));
// 48
printf("%d\n", sizeof(a[0][0]));
// 4
printf("%d\n", sizeof(a[0])); 
// 16
printf("%d\n", sizeof(a[0]+1)); 
// 4
printf("%d\n", sizeof(*(a[0]+1))); 
// 4
printf("%d\n", sizeof(a+1)); 
// 4
printf("%d\n", sizeof(*(a+1))); 
// 16
printf("%d\n", sizeof(&a[0]+1)); 
// 4
printf("%d\n", sizeof(*(&a[0]+1))); 
// 16
printf("%d\n", sizeof(*a)); 
// 16
printf("%d\n", sizeof(a[3]));
// 16

 


我们的征途是星辰大海!