C语言笔记(一)---指针

it2026-06-21  7

#include <stdio.h> #include <stdlib.h> #include <string.h>

//指针类型应与数据类型对应(int指针指向int数据) int main10() { //1.野指针:指向随机内存(用于攻击改变数据) //2.空指针:*p=NULL(进行条件判断) //3.万能指针:int a =2,void *p=&a;(只能这样,不能进行更多的操作)

int a = 10; void *p = &a; *(int *)p = 100;//将void指针变为整型指针,再赋值 printf("%d\n", a); printf("%d\n", (int)p); system(“pause”); return 0;

} int main11() {

int arr[5] = { 0 }; void* p = arr; (int)p = 100; ((int)p + 1) = 200;//将arrp[1]赋值为200 printf("%d\n", arr[0]); printf("%d\n", arr[1]); system(“pause”); return 0;

} int main12() { //1.这样写const不安全,可以通过指针修改,改成#define lv 100 const int a = 100; int* p = &a; *p = 200; printf("%d\n", a); printf("%d\n", p); system(“pause”); return 0; } int main13() { int a = 100; int b = 200; const int p = &a; //p = 200;//error!2.const修饰整型指针,指针不能改变指向地址的值p,但可以改变地址 p = &b; printf("%d\n", p); system(“pause”); return 0; } int main14() { int a = 100; int b = 200; int const p = &a; //p = &b;error! 3.const修饰p,则p的地址不能改变,*p的值可以改变 *p = 888; printf("%d\n", a);//指向的还是a的地址,a的值也改变 printf("%d\n", p); system(“pause”); return 0; } int main15() { int a = 10; //4.都不能改变,但二级指针能改 int b = 20; const int const p = &a; //p = &b;error! //*p = 122;error! } int main16() { //5.指向数组的指针,当操作指针的时候,间接操作了数组

int arr[5] = { 1,2,3,4,5 }; int* p = arr; //此时p指向arr[0]的地址,*p=arr[0] printf("%d\n", p[2]);//这里p[2]=arr[2] p++;//此时p指向arr[1]的地址 *p = 100;//{1,100,3,4,5} p = 100;//野指针 p = &arr[4]; //此时p指向arr[4]的地址 p--;//此时p指向arr[3]的地址 *p = 200; //{1,100,3,200,5} p = &arr[0]; *p += 300;//{301,100,3,200,5} for (int i = 0; i < 5; i++) { printf("%d\n", arr[i]); } //指针降级 int* p1 = arr; *(p1 + 1) = 100;//arr[1]=100 p1++; //p指向arr[1]的地址(p指向的地址发生了改变) *(p1 + 2) = 123;//arr[3]=123;(p指向的地址没有改变) //p++表示内存地址加了一个int(4个字节)的大小,int当成单位 system("pause"); return 0;

}int main17() { //6.指针数组中的元素是地址 int a = 10; int b = 20; int c = 30; int* arr[] = { &a, &b, &c }; //arr[0] = &a;//存放的是地址 //arr[1] = &b; *arr[0] = 100; printf("%d\n", a);

char* ar[] = { "hello", "world!" }; printf("%c\n", *(ar[0]+1));//ar[0]是hello的首地址,+1是hello中第几个的地址 system("pause"); return 0;

} int main18() { //7.多级指针,二级指针指向一级指针的地址,加指向一级指针指向的地址,加**表示一级指针指向地址的值。 int a = 10; int p = &a; int** pp = p; //*pp = &a = p; **pp = 200; printf("%d\n", a); system(“pause”); return 0; } //8.值传递function(a,b)和地址传递function(&a,&b)

//9.函数参数中的数组会退化为指针,因此需要传入数组长度(字符串不用,字符串以\0结尾) void print1(int arr[5])//这里的arr[5]相当于*p { for (int i = 0; i < sizeof(arr); i++) {//实际上是sizeof(int )=4 printf("%d\n", arr[i]); } } void print2(int p, int len) { for (int i = 0; i < len; i++) {//实际上是sizeof(int *)=4 printf("%d\n", p[i]);//p[i]=arr[i]={0,1,2,3,4} } } int main19() { int arr[] = { 0,1,2,3,4 }; print1(arr); print2(arr, sizeof(arr)/sizeof(arr[0])); system(“pause”); return 0; }

//10.函数的返回值为指针 char* test() { //char arr[] = “hello world”;//字符数组,在栈区创建,本函数运行完会销毁,不会传回主函数 char* ar = “hello world”;//字符串常量,在程序运行时在常量区 return ar; } int main110() { char* p = test(); printf("%p\n", p);//地址 printf("%s\n", p);//值 system(“pause”); return 0; } int main111() { char arr[] = “hello world”; char* p = arr; *p = ‘A’; p++; *p = ‘B’; printf("%d\n", sizeof(arr));//12,总长度 printf("%d\n", strlen(arr));//11,有效字符长度(不含\0) printf("%d\n", sizeof§);//4,相当于sizeof(char *) printf("%d\n", strlen§);//10,因为前面有p++,指针指向的地址向后移动了一位 system(“pause”); return 0; }

int main112() { char *p = “hello world”;//常量区,字符串常量不能改变值 char arr[] = “hello world”;//栈区 printf("%d\n", p);//%d打印出来首地址 printf("%s\n", p);//%s打印出来字符串 printf("%c\n", p[0]);//p[0]=*p system(“pause”); return 0; }

最新回复(0)