指针与数组的基础知识分析
2017-08-04 15:26
141 查看
指针的小结
指针是存放地址才出现的,地址是为了表示一块儿空间的。
指针让地址有效地方存放,指针让内存的访问更加方便。
指针的大小在32位平台上是4个字节,在64位平台上是8个字节。
指针的创建 type + *
当不知道给指针初始化什么值的时候,一定要记得赋空指针,如:char* pc = NULL;
指针和指针的类型
一级指针
类型不同的影响
由例1、例2得出:指针类型决定了指针有多大权限去访问空间
例3:指针+-整数。
由例3得出:指针类型决定指针的步长(指针+i加的是i*sizeof(指针所指向元素的类型)),int*走一步走四个字节,char*走一步走一个字节
二级指针
一维数组
二维数组
指针数组
每个元素都是指针
数组指针
指向数组的指针
定义成数组,申明成指针
定义成指针,申明成数组
数组传参
一级指针传参
二级指针传参
函数指针
指针是存放地址才出现的,地址是为了表示一块儿空间的。
指针让地址有效地方存放,指针让内存的访问更加方便。
指针的大小在32位平台上是4个字节,在64位平台上是8个字节。
int main() { int a = 10;//在内存中开辟一块儿空间 int *p = &a;//在这里我们对变量a,取出它的地址,可以使用&操作符。 //将a的地址存放在p变量中,p就是一个指针变量。 system("puase"); return 0; } //总结:指针就是变量,用来存放地址的变量。(存放在指针中的值都被当成地址处理)。
指针的创建 type + *
当不知道给指针初始化什么值的时候,一定要记得赋空指针,如:char* pc = NULL;
指针和指针的类型
int main() { int a = 10; char c = 'w'; double d = 3.14; //创建不同类型的指针 int* pa = &a; char* pc = &c; double* pd = &d; printf("%d\n", sizeof(char));//1 printf("%d\n", sizeof(short));//2 printf("%d\n", sizeof(int));//4 printf("%d\n", sizeof(float));//4 printf("%d\n", sizeof(double));//8 printf("%d\n", sizeof(long));//4/8 printf("%d\n", sizeof(long long));//8 printf("%d\n", sizeof(char*));//4 printf("%d\n", sizeof(short*));//4 printf("%d\n", sizeof(int*));//4 printf("%d\n", sizeof(float*));//4 printf("%d\n", sizeof(double));//4 printf("%d\n", sizeof(long*));//4 printf("%d\n", sizeof(long long*));//4 system("puase"); return 0; }
一级指针
int main() { 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));//err printf("%d\n", strlen(p[0]));//err printf("%d\n", strlen(&p));//随机值 printf("%d\n", strlen(&p + 1));//随机值 printf("%d\n", strlen(&p[0] + 1));//5 system("pause"); return 0; }
类型不同的影响
例1:整型指针 int main() { int a = 0x11223344; int *pa = &a; *pa = 0; system("pause"); return 0; }
例2:字符指针 int main() { int a = 0x11223344; char *pa = &a; *pa = 0; system("pause"); return 0; }
由例1、例2得出:指针类型决定了指针有多大权限去访问空间
例3:指针+-整数。
由例3得出:指针类型决定指针的步长(指针+i加的是i*sizeof(指针所指向元素的类型)),int*走一步走四个字节,char*走一步走一个字节
指针-指针 int main() { int arr[10] = { 0 }; int* p = &arr; printf("%d\n", &arr[9]-&arr[0]);//9 printf("%d\n",(p+9)-p );//9 system("pause"); return 0; }//指针-指针=指针之间元素的个数,这两个指针必须在同一个范围
二级指针
一维数组
int main() { //整型数组 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 + 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 printf("%d\n", strlen(arr));//随机值 printf("%d\n", strlen(arr + 0));//随机值 printf("%d\n", strlen(*arr));//无法运行 printf("%d\n", strlen(arr[1]));//无法运行 printf("%d\n", strlen(&arr));//随机值 printf("%d\n", strlen(&arr + 1));//随机值 printf("%d\n", strlen(&arr[0] + 1));//随机值 system("pause"); return 0; }
二维数组
int main() { 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,表示的是a[0][1] printf("%d\n", sizeof(a + 1));//4,表示第二行的地址 printf("%d\n", sizeof(&a[0] + 1));//4,表示第二行的地址 printf("%d\n", sizeof(*a));//16,表示对第一行的所有值进行解引用 printf("%d\n", sizeof(a[3]));//16,其表达式等价于a[0],即表示二维数组的一行 system("pause"); return 0; }
指针数组
每个元素都是指针
例: int main() { int a = 10; int b = 20; int* arr[2] = { &a, &b };//可存放a与b的地址 char* arr2[3] = { "zhangsan", "lisi", "wangwu" };//存入的是每个字符串首元素的地址 int i = 0; int j = 0; for (j = 0; j < 2; j++) { printf("%d ", *arr[j]); } printf("\n"); for (i = 0; i < 3;i++) { printf("%s ", arr2[i]); } system("pause"); return 0; }
数组指针
指向数组的指针
int main() { int arr[10]; int *parr = arr; int(*ptr)[10] = &arr;// int(* )[10]类型 //能够指向大小为10个整型的数组指针 char* arr2[10]; char* (*p)[10] = &arr2; //能够指向大小为10个char*型的数组指针 system("pause"); return 0; }
例: void print(int(*arr)[4], int x, int y) { int i = 0; for (i = 0; i < x;i++) { int j = 0; for (j = 0; j < y;j++) { //printf("%d ",arr[i][j]; printf("%d ", *(*(arr + i) + j)); } } } int main() { int arr[3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }; print(arr, 3, 4); system("pause"); return 0; }
定义成数组,申明成指针
定义成指针,申明成数组
数组传参
例: //void test(int arr[3][4][5]) //void test(int arr[ ][4][5]) void test(int (*p)[4][5]) { } int main() { int arr[3][4][5]; test(arr); system("pause"); return 0; }
一级指针传参
例: void print(int *p, int sz) { int i = 0; for (i = 0; i < sz;i++) { printf("%d\n", *(p + i)); } } int main() { int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }; int *p = arr; int sz = sizeof(arr) / sizeof(arr[0]); print(p, sz);//一级指针p,传给参数 system("pause"); return 0; }
小结: void test(int *p) { } int main() { //一级指针可以传的参数 int arr[10]; int *ptr = NULL; int a = 10; test(arr); test(ptr); test(&a); system("pause"); return 0; }
二级指针传参
void test(int **p) { } int main() { //二级指针可以传的参数 int* arr[10]; int *ptr = NULL; int **a = 10; test(arr); test(&ptr); test(a); system("pause"); return 0; }
函数指针
例: void test() { printf("hehe\n"); } int main() { printf("%p\n", &test); printf("%p\n", test); (*&test)();//这里的*不起任何作用,(&test)(); (*test)();//这里的*不起任何作用,(test)(); test(); system("pause"); return 0; }
例: void test(const char* str) { printf("%s\n", str); } int main() { //void *p1(const char*); void(*p2)(const char*);//p2为一个函数指针变量 p2 = &test; p2("hehe"); system("pause"); return 0; }
例: int Add(int a, int b) { return a + b; } int main() { int(*p)(int, int) = Add;//将Add函数的地址存在一个函数指针里 printf("%d\n", p(1, 2));//调用并输出 system("pause"); return 0; }
相关文章推荐
- 指针和数组基础知识
- 指针基础知识 ,破坏指针数组的讨论,
- C/C++基础知识总结——数组、指针域、字符串
- (*p)[n] ,指向多维数组的指针运算基础知识
- C 数组基础知识分析
- C语言基础知识之(十三):指针、指针和数组
- 剑指offer-数据结构:数组和指针(基础知识)
- C语言基础知识之(十四):指针和字符数组、字符串数组
- 位运算的基础知识点(关联指针、数组的操作)
- C语言中 指针的基础知识总结, 指针数组的理解
- C基础知识--指针与数组
- 指针与数组_基础知识
- C/C++基础知识(一)数组和指针
- 黑马程序员--C语言基础之--数组、指针的基础知识
- 指针知识梳理10-指向数组的指针
- C++基础知识:c 函数调用过程原理及函数栈帧分析
- 算法分析的基础知识
- c/c++数组与sizeof的基础知识——写的非常好,解惑
- Java基础知识和常用数据结构整理与分析
- C语言基础及指针②之指针内存分析