c语⾔把结构体⾸地址放⼊指针,C语⾔基础———指针,结构体
指针,函数指针
指针基础
⼀ 指针就是地址,地址就是指针.指针存储的是内存的地址.
⼆ 指针的定义
1.&表⽰取址运算符,&a 可以取到 a 在内存中的地址;打印地址的占位符为(%p),printf(“%p\n”,&a);
2. 指针变量的定义
指针变量是⽤来存放地址的.
指针定义的格式:
类型数据 *变量名 = 初始值;
int *p = NULL;*在这⾥表⽰p 是⼀个指针变量,不是运算符.
printf(“%p\n”,p); 在打印指针的时候不需要使⽤取址运算符(&),因为指针本来就是地址.
*p 指针为空时,打印出来0x0的地址,为空.
int a = 10;
p = &a;
printf(“%p\n”,p);
访问内存中的数据有两种⽅法:
1.直接访问内存中的数据.
printf(“%p\n”,a);
2. 通过指针进⾏访问.
*也可以作为取值运算符.* p 代表取到 p 指向内存中存储的数据 printf(“%d\n”,*p);
int a = 10,b = 20;
int *p1 = &a;
int *p2 = &b;
对指针重新赋值,意味着指针重指向,也就是说指针指向⼀个.
p1 = p2;p1指向 c 的⾸地址
printf(“*p1 = %d,* p2 = %d\n”,*p1,*p2);
int a = 15,b = 20;
int *p = &a;
int *p1 = &b;
单独的* p 表⽰取值,* p = 11 表⽰向 p 指向的内存中存⼊数据.
*p = 11;
printf(“%d\n”,a);
*p1 = 8;
printf(“a = %d,b = %d\n”,a,b);a = 11,b = 8
经典练习
int a = 6,b = 8,c = 10;
int *x = &a;
x = &c;
int *y = &b;
int *z = &c;
*z = 5;
*x = 12;
x = y;
结构体数组不能作为参数传递给函数
*y = *x + *z;
printf(“a = %d,b = %d,c = %d\n”,a,b,c);
指针中常见的问题
1.内存编号⽐较⼩的存储单元,是由系统控制的,不允许访问.
int *p = NULL;
*p = 100; error
2.野指针,定义时没有赋初始值,操作野指针是很危险的
int *p;
*p = 100;error
3.定义指针时,*怎么写?
int *p = NULL;推荐
int* p1 = NULL;
int *p1 = NULL;
int*p3 = NULL;
4.指针变量在内存中占⼏个字节
与数据类型⽆关,在32位操作系统下,指针所占字节数是4位,在64位操作系统中,指针所占字节数是8位. printf(“%lu\n”,sizeof(long *));
5. 修饰指针变量数据类型的作⽤
a. 指针变量数据类型,决定*(取值运算符),取多少个字节的数据;
定义指针的数据类型⼀定要和指向数据的数据类型⼀致,这样才能把数据完整的取出来
int *p = NULL;
printf(“%d\n”,*p);
char *c = NULL;
c = &a;
printf(“%d\n”,*c);
b.指针类型,决定指针变量加1操作时,跳转多少个字节
int *p = NULL;
printf(“%p\n”,p); //0x0
printf(“%p\n”,p+1);//0x4
printf(“%p\n”,p+2);//0x8
printf(“%p\n,p++);//打印的结果是:0x4 但是实际结果是:0x8 p+1 和 p++或++ p 的关系
相同:取到的都是下⼀个字节的地址
不同:++p和 p++ 造成指针的重指向
6.指针在数组中的应⽤
int a[5] = {1,2,3,4,5};
数组名就是数组元素的⾸地址
printf(“%p\n”,a);
printf(“%p\n”,&a[0]);
printf(“%p\n”,p);
printf(“%p\n”,a+1);
printf(“%p\n”,&a[1]);
printf(“%p\n”,p+1);
printf(“%p\n”,a+2);
printf(“%p\n”,&a[2]);
printf(“%p\n”,p+2);
printf(“%d\n”,*a);
printf(“%d\n”,*(a +1));
printf(“%d\n”,*(a+2));
⽤指针遍历数组
for(int i= 0;i < 5;i++){
printf(“%d\n”,*(a+i));
}
定义指针变量访问数组中的元素
int *p =NULL;
p = a;
printf(“%p\n”,a);
printf(“%p\n”,p);
printf(“%d\n”,*p);
printf(“%d\n”,*(p+1));
printf(“%d\n”,*(p+2));
练习
有10个元素的数组,通过指针变量为元素随机赋值[22 33]
7.数组名(数组元素的⾸地址) 与指向数组⾸地址的指针变量的区别:
a. 数组名(数组⾸地址) 是⼀个常量地址不能被修改
a = NULL;error
指针变量可以修改,可以重指向
b. 数组名(数组的⾸地址),⽤sizeof 计算得到的结果,整个数组所占的字节数,⽽⽤ sizeof 计算指向数组元素⾸地址的指针变量得到是⼀个定值4或者8
printf(“%lu\ n”,sizeof(c));
//定义⼀个10个元素的数组,通过指针变量为元素随机赋值[22 33],冒泡排序;
8.指针在字符串中的应⽤
⽤% s 打印是从指针指向那个地址开始向后输出
char string[] = “Canglaoshi”;
printf(“%s\n”,string);
printf(“%s\n”,string+1);
通过指针访问⾥⾯的元素
数组名(数组元素的⾸地址) == 指针
*(string + 3) = ‘\0'
printf(“%s\ n”,string);
通过指针访问元素
printf(“%c\ n”,*(string +3));
通过指针计算字符串的长度
int i= 0;
*(string +i) 取到数组中对应位置的值
while(*(string+i) != ‘\0’){//string[i]
i++;
}
printf(“%d\n”,i);
指针变量⼀定要和指向的数据类型相同
char *p = string;
int i = 0;
while(*(p+i) != ‘\0’){
i++;
}
char string[] = "canglaoshi I love you";//将字符串的⾸个字母⼤写,并且将空格换成下划线
char string[] = "canglaoshi I love you";
*string -= 32;
char *p = string;
if (string[0] >= 'a' && string[0] <='z') {
string[0] -= 32;
}
int i = 0;
while (*(string+i) != '\0') {
if (*(string + i) == ' ') {
*(string + i) = '-';
}
i++;
}
printf("%s\n",string);
//写⼀个函数实现两变量的交换
int a = 10;
int b = 20;
change(&a,&b);
printf("a = %d,b = %d\n",a,b); int a = 10,b = 20; int sum = 0,sub = 0;
sum = sumAndsub(a,b,&sub); printf("sum = %d,sub = %d\n",sum,sub); float a[10] = {0}; for (int i = 0; i < 10; i++) {
*(a+i) =arc4random()%21+10;
printf("%.2f ",*(a+i));
} printf("\n"); for (int i = 0; i < 10 - 1; i++) { for (int j = 0; j < 10 - i - 1;j++) {// if (a[j] > a[j + 1]) {// float temp = 0;// temp = a[j];// a[j] = a[j + 1];// a[j + 1] = temp;// } if (*(a + j) > *(a + 1 + j)) { float temp = 0;
temp = *(a +j);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论