指针小聊
来源:互联网 发布:java 异步io 框架 编辑:程序博客网 时间:2024/05/16 13:44
复习指针和数组相关运算
一维数组 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)); //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)); //随机值 遇到\0才停下来 printf("%d\n", strlen(arr+0)); //随机值 printf("%d\n", strlen(*arr)); //err a的ASCII码97 不允许访问 printf("%d\n", strlen(arr[1])); //err b printf("%d\n", strlen(&arr)); //随机值 printf("%d\n", strlen(&arr+1)); //随机值 printf("%d\n", strlen(&arr[0]+1)); //随机值 *char *p = "abcdef"; printf("%d\n", sizeof(p)); //4 字符a的地址 printf("%d\n", sizeof(p+1)); //4 字符b的地址 printf("%d\n", sizeof(*p)); //1 p是字符指针,对p解引用可以访问一个字节 printf("%d\n", sizeof(p[0])); //1 p[0]==*(p+0) 第一个元素 printf("%d\n", sizeof(&p)); //4 printf("%d\n", sizeof(&p+1)); //4 printf("%d\n", sizeof(&p[0]+1)); //4 b的地址 printf("%d\n", strlen(p)); //6 printf("%d\n", strlen(p+1)); //5 p+1为b的地址 printf("%d\n", strlen(*p)); //err printf("%d\n", strlen(p[0])); //err printf("%d\n", strlen(&p)); //随机值 printf("%d\n", strlen(&p+1)); //随机值 二维数组 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+1)); //4 第二行地址 printf("%d\n", sizeof(&a[0]+1)); //4 第二行地址 a[0]为第一行数组名 printf("%d\n", sizeof(*a)); //16 第一行的地址解引用 假想为一唯数组 第一行的大小 printf("%d\n", sizeof(a[3])); //16 sizeof内部的表达式不参与运算 第四行数组名虽不存在但不影响计算 因为不会放入
一级指针
#include <stdio.h>int main(){ int a = 10; int *p = &a; printf("%p\n",p); return 0;}
此处p为一个一级指针,p中存储的是变量a的地址
由此可见,指针就是变量, 用来存放地址的变量。
二级指针
int main(){ int a=10; int *pa=&a; int **ppa=&pa; printf("%p\n",a); printf("%p\n",pa); return 0;}
指针类型
通过指针引用一个变量,必须知道该数据的类型,才能按存储单元的长度以及数据的存储形式正确的取出该数据。即在定义指针变量时必须指定基类型。
指针表达式解析
一般左值代表空间,右值代表内容,左值不一定能够放在等号左边
&ch; //不能放在等号左边,能放在等号右边cp; //能放在等号左边,能放在等号右边&cp; //不能放在等号左边,能放在等号右边(表示cp的地址)*cp+1; //不能放在等号左边(常量不能被赋值),放在等号右边相当于字符b*(cp+1) ;//表示a后面的空间,能放在等号左边++cp; //在c语言中,一个变量进行前置加加或者后置加加都不能放在等号左边cp++; *++cp; //和表达式*(cp+1)效果一样*cp++; //能放到等号左边,能放到等号右边++*cp; //能放到等号右边,相当于字符b(*cp) ++;//能放到等号右边,相当于字符a,但此时ch指向b++*++cp; //表示ch下一块地址的东西自增
指针数组
指针数组是数组, 是一个存放指针的数组。
eg:
int *arr1[10];char *arr2[4];char **arr3[5];
数组指针
eg:int (*p)[10];
p先和*结合, 说明p是一个指针变量, 然后指着指向的是一个大小为10个整型的数组。 所以p是一个指针, 指向一个数组, 叫数组指针。
函数指针
void(*P)(int char)=test1;void(*P)(int char)=test1;//函数指针void(*parr[3])(int char)=(test1,test2,test3);//函数指针的数组void(*(*ptr[3])(int char)=&arr;//指向函数指针的指针
#include<stdio.h>int ADD(int a,int b){ return(a+b);}int main(){ int (*p)(int,int)=ADD;//定义一个返回值类型为整形,有两个参数,且参数为整形的函数指针*p printf("%d\n",p(1,3));//通过函数指针来访问其所指向的函数Add return 0;}
阅读全文
0 0
- 指针小聊
- 函数指针小例
- 指针小问题
- c++ 指针小程序
- 指针小常识
- 指针小练习
- 指针数组小感受
- 指针小分析
- 指针小知识
- 指针函数小练习
- 小话C指针
- 指针的小总结
- 小知识 . 指针
- 指针小笔记
- 指针拷贝小例子
- 指针小笔记
- 智能指针小分析
- 智能指针小代码
- [LeetCode]647. Palindromic Substrings
- hpu暑假训练A
- 编写程序,打印出9×9乘法表
- Busybox1.27.1make menuconfig配置界面
- SQL的Join语法
- 指针小聊
- 挖地雷
- 教你上传本地代码到github
- Android Studio不能获取远程依赖包的解决方法
- ubuntu14.04挂载共享文件夹
- Linux之在CentOS上一次艰难的木马查杀过程
- 着色器脚本的加载及编译
- 【框架学习】AOP切面详解
- 置顶] 2017 暑期实习校园招聘(Java后台开发方向)面经分享