#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> //数组名是首元素地址 指针就是地址,指针变量也是指针 //int main() //{ // int a = 10;//a占4个字节 // int*pa=&a;//*说明pa是指针变量,将a的地址放在指针变量pa中,字节是4,int型,拿到的是a的4个字节的第一个字节的地址 // *pa = 20;//将a改为20 // return 0; //} //int main() //{ // int* pa = 0; // char* pb = 0; // float* pc = 0; // printf("%d\n", sizeof(pa));//打印结果都为4,但指针类型都有具体意义 // printf("%d\n", sizeof(pb)); // printf("%d\n", sizeof(pc)); // return 0; //} //指针类型的意义: //1,指针类型决定,指针解引用的权限有多大,(int型4个字节,char型1个字节) //int main() //{ // int a = 0x11223344;//0x表示十六进制,每一位用二进制都用八个二进制表示,如11111111 // int* pa = &a;//将地址a存放在pa中,pa里面存放的是a的地址 // *pa = 0;//将pa改为0(4个字节) // return 0; //} //2.指针类型决定了,指针走一步,能走多远(字节)(指针int型+1--->4个字节 char型+1---->1个字节 //int main() //{ // int arr[10] = { 0 }; // int* pa = arr;//数组名就是首元素地址,将地址拿给指针变量pa // char* pc = arr; // printf("%p\n", pa);//打印结果为003EF9C4(随机值) // printf("%p\n", pa+1);//打印结果为003EF9C8 int型,pa+4 // printf("%p\n", pc);//打印结果为003EF9C4(随机值) // printf("%p\n", pc+1);//打印结果为003EF9C5 char值,pc+1 // return 0; //} //int main() //{ // int arr[10] = { 0 }; // int* p = arr; // int i = 0; // for (i = 0; i <= 10; i++) // { // *(p + i) = 1;//p+i其实是下标为i的地址 //把整形元素每一个元素都改为1 // } // return 0; //} //野指针:指针指向位置不可知(随机,不正确,没有明确限制) //野指针成因: // //1.指针未初始化 //int main() //p是野指针 //{ // int* p ;//p是局部指针变量,局部变量不初始化,默认是随机值,此时p里面放的是随机值,随即地址 // *p = 20;//随机地址的空间,可能不是自己的空间!!!!非法访问内存 // return 0; //} // //2.指针越界访问 //int main() //{ // int arr[10] = { 0 }; // int* p = arr;//此时p指向arr首元素的首地址,下标为0,为p+0;最后一个下标为10,为p+10,越界访问了 // int i = 0; // for (i = 0; i <= 10; i++)//循环11次 // { // *p = i; // p++; // } // return 0; //} // //3.指针指向的空间释放 //int* test() //{ // int a = 10; // return &a;//返回a的地址 //} //int main() //{ // int* p = test();//将test函数放在指针变量a中,引用test函数,引用完销毁 // *p = 20;//将指针变量p的值变为20,此时test函数已被引用并销毁 // return 0; //} //如何规避野指针 //1.指针初始化 //int main() //{ // int* a = NULL;//当前不知道p应该初始化为什么地址时,初始化为NULL NULL是0,或者把0强制转换为void型指针 // int* a;//放的是随机值,不能被使用 // //应该为 明确知道初始化的值 // int a = 10; // int* pra = &a; // printf("a=%d\n", a); // return 0; //} //2.小心指针越界-----C不会检查的 //3.指针指向空间释放及时置NULL //4.指针使用之前检查有效性 //int main() //{ // int* pa = NULL; // //*pa = 10;//不能访问\0,因为\0地址无法被使用,无效被指针变量指向 // //应为 // if (*pa!= NULL) // { // *pa = 10; // }//此时要不指向有效空间,要不指向空指针 // return 0; // } //指针运算 //1.指针+-整数 //int main() //{ // int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; // int* pa = arr; // int* pand = arr + 9; // while (pa <= pand) // { // printf("%d\n",*pa);//将pa数组里的数从下标0开始,由低到高,逐个向前打印 // pa++;//初始化向前一个下标,使满足pa<=pand的每一个都打印(先用,后++) // } // return 0; //} //2.指针-指针 前提:两个指针指向同一个空间 到\0为止 //int main() //{ // int arr[10] = { 0 }; // int* pa = arr; // printf("%d\n", &arr[9] - &arr[0]);//打印结果为9 arr[9]是第十个元素10的地址,arr[0]是第一个元素0的地址 // //但是下面这个是错误的 // char ch[5]; // printf("%d\n", &arr[9] - &ch[0]);//该方法错误,因为&arr和&ch不是同一空间 // return 0; //} #include<string.h> //计数器法实现自创函数my_strlen //int my_strlen(char* str)//传给my_strlen的是地址,可以用地址接收,返回的是长度,int型 //{ // int count = 0;//计数器 // while (*str != 0) // { // count++; // str++; // } // return count; //} //指针-指针法实现my_strlen int my_strlen(char* str)//创建int型, { char* start = str;//将str指向指针变量str while (*str != '\0') { str++; } return str - start; } int main() { int len = strlen("a,b,c");//strlen---求字符串长度 printf("%d\n", len);//打印结果为5,因为,也是一个字节 int lent=my_strlen("a,b,c");//自己创建函数,并打印字符串 字符串a,b,c传参时,传过来的只是a的地址 printf("%d\n", lent);//打印结果为5 return 0; }