文山微网站建设,网站开发公司盈利,网站建设必知,网站建设案例精粹什么是指针#xff1f;指针和指针类型野指针指针运算指针和数组二级指针指针数组什么是指针#xff1f;指针是内存中一个最小单元的编号#xff0c;也就是地址。1.把内存划分为一个个的内存单元#xff0c;一个内存单元的大小是一个字节。2.每个字节都给定唯一的编号#…什么是指针指针和指针类型野指针指针运算指针和数组二级指针指针数组什么是指针指针是内存中一个最小单元的编号也就是地址。1.把内存划分为一个个的内存单元一个内存单元的大小是一个字节。2.每个字节都给定唯一的编号这个编号称之为地址。地址在C语言中也叫指针。编号地址指针2.我们说的指针通常指的是指针变量是用来存放内存地址的变量。int main()
{int a 10;int* pa a;//a的地址放在指针变量pa中,pa的类型是int *return 0;
}指针变量使用取地址操作符取出变量的内存起始地址把地址存放到一个变量中这个变量就是指针变量。 int main()
{int a 10;int* pa a;pa10return 0;
}注意a是整型占用4个字节的内存空间每个字节都有对应的地址。a 得到的是a的地址其实得到的是a所占内存中4个字节中第一个字节地址pa10 其实存放的是地址4.一个指针变量在32位的平台上是4个字节在64位的平台上是8个字节2.指针和指针类型所有指针类型在x86环境下全是4个字节在x64环境下是8个字节。指针类型的意义 1.指针类型决定了在解引用指针的时候能访问几个字节 对于整型指针解引用时访问4个字节 对于字符型指针解引用时访问1个字节2.指针进行加减整数时int型加4个字节char型加1个字节int main()
{int a 10;int* pa a;char* pc a;printf(%p\n, pa);printf(%p\n, pa 1);printf(%p\n, pc);printf(%p\n, pc 1);return 0;
}int main()
{int arr[10] { 0 };int* p arr[0];int i 0;for (i 0; i 10; i){*p i 1;p;}for (i 0; i 10; i){printf(%d , arr[i]);//1 2 3 4 5 6 7 8 9 10}return 0;
}3. 指针解引用指针的类型决定了对指针进行解引用有多大的权限。char* 只能访问一个字节int* 访问4个字节3.野指针野指针就是指针指向的位置是不可知的随机的不正确的没有明确限制的。野指针成因指针未初始化指针越界访问指针指向的空间释放int* test()
{int a 10;//a的空间被释放局部变量return a;
}
int main()
{int* p test();*p 100;
}如何规避野指针指针初始化int main()
{int a 10;int* p a;return 0;
}
小心指针越界指针指向空间释放时及时置NULL一个指针不知道指向哪里时暂时可以置为空指针NULL避免返回局部变量的地址int* test()
{int a 10;//a的空间被释放局部变量return a;
}
int main()
{int* p test();*p 100;
}指针使用之前检查有效性使用指针之前判断指针是否为空指针运算指针-整数int my_strlen(char* str)
{int count 0;while (*str ! \0){count;str;//指针整数}return count;
}
int main()
{char arr[10] abcdef;int len my_strlen(arr);printf(%d\n, len);return 0;
}char* str是字符型指针所以str是跳过一个字符指针-指针地址-地址注意1.两个指针指向同一块内存空间指针的类型是一致的2.指针-指针得到的是指针和指针之间的元素个数int main()
{int arr[10] { 1,2,3,4,5,6,7,8,9,10 };int n arr[9] - arr[0];//arr[0]-arr[9]-9printf(%d, n);//9return 0;
}int my_strlen(char* str)
{char* start str;while (*str ! \0){str;}return str - start;
}
int main()
{char arr[10] abcdef;int len my_strlen(arr);printf(%d\n, len);return 0;
}指针的关系运算标准规定1.允许指向数组元素的指针与指向数组最后一个元素后面的那么内存位置的指针进行比较2.不允许与指向第一个元素之前的那个内存位置的指针进行比较//1.
for (vp values[N_VALUES]; vp values[0];)
{*--vp 0;
}//2.
for(vp values[N_VALUES-1]; vp values[0];vp--)
{*vp 0;
}5.指针和数组指针就是指针数组就是数组指针的大小4/8个字节指针是存档地址的地址的存放需要多大空间指针变量的大小就是多少。数组的大小取决于数组的元素个数和每个元素的类型。int main()
{int arr[10] { 0 };int* p arr;//arr[0]int i 0;//存放for (i 0; i 10; i){*p i 1;p;}//打印p arr;for (i 0; i 10; i){*(p i) i 1;printf(%d , *(p i));}return 0;
}6.二级指针int main()
{int a 10;//一级指针int* pa a;//pa是指针变量用来存放地址向内存申请空间4/8//二级指针int** ppa pa;//指向pa空间的指针变量ppareturn 0;
}int main()
{int a 10;//一级指针int* pa a;//pa是指针变量用来存放地址向内存申请空间4/8//二级指针int** ppa pa;//指向pa空间的指针变量ppaprintf(%d, **ppa);//10return 0;
}7.指针数组int main()
{int a 10;int b 20;int c 30;//存放指针的数组int* arr[] { a,b,c };int i 0;for (i 0; i 3; i){printf(%d , *(arr[i]));}return 0;
}指针数组是一个数组数组中每个元素都是指针类型拓展int main()
{int arr[10] { 1,2,3,4,5,6,7,8,9,10 };int i 0;int* p arr;//arr[i]--*arri)--*(iarr)--i[arr]//*(arri)--*(pi)--arr[i]for (i 0; i 10; i){printf(%p%p\n, arr[i], p i);}return 0;
}这里arr[i]和i[arr]相等[ ]就相当于一个操作符int main()
{int arr[10] { 1,2,3,4,5,6,7,8,9,10 };int i 0;for (i 0; i 10; i){printf(%d , i[arr]);//i[arr]--*(iarr)//arr[i]--*(arri)}return 0;
}int main()
{int arr[3][5];//arr[i[[j]//(*(arr i))[j]//*(*(arr i) j)return 0;
}感谢阅读欢迎大家批评指正