指针大小和数据类型是在32位和64位系统之间迁移代码时需要特别注意的重要方面。下面是关于指针大小和数据类型的一些详细信息:
指针大小: 在32位系统上,指针的大小通常是4字节(32位),而在64位系统上,指针的大小通常是8字节(64位)。这意味着在从64位迁移到32位系统时,你需要确保你的代码中的指针操作和使用都适应了32位的指针大小。
p存放i的地址,则p指向i。
#include <stdio.h>
int main(){
int i=1;
int p =&i;
printf("%ld\n",sizeof(int));
printf("0x%x\n",&i);
printf("%p\n",&i);
printf("%d\n",p);
printf("%ld\n",sizeof(&i));
printf("%ld\n",sizeof(int*));
return 0;
}
#include <stdio.h>
int main(){
int i=1;
int p ;
int a[10];
printf("%p\n",&i);
printf("%p\n",&p);
printf("%p\n",&a);
printf("%p\n",a);
printf("%p\n",&a[0]);
printf("%p\n",&a[1]);
return 0;
}
关于相邻变量。i和p地址分别为:
000000000061FE1C
000000000061FE18
相差int字节,i是高地址,原因是 堆栈自顶向下。
int* p,q p是pointer q是int
#include <stdio.h>
void f(int *p);
void g(int k);
int main(){
int i =6;
printf("%p\n",&i);
f(&i);
g(i);
return 0;
}
void f(int *p){
printf("p=%p\n",p);
printf("*p=%d\n",*p);
++*p;
}
void g(int k){
printf("k=%d",k);
}
不解释了
应用场景:
1.swap
#include <stdio.h>
void swap(int* p,int* q);
int main(){
int a = 1;
int b = 7;
swap(&a,&b);
printf("a=%d,b=%d",a,b);
return 0;
}
void swap(int *p,int *q){
int t=*p;
*p = *q;
*q = t;
}
2 多个返回值
#include <stdio.h>
void minmax(int a[],int len,int *min,int *max);
int main(){
int a[]={1,2,3,5,6,8,9,12,13,15,17,19,33,42};
int min,max;
minmax(a,sizeof(a)/sizeof(a[0]),&min,&max);
printf("min = %d max = %d",min,max);
return 0;
}
void minmax(int a[],int len,int *min,int *max){
int i;
*min=*max=a[0];
for(i=1;i<=len-1;i++){
if(a[i]<*min){
*min=a[i];
}
if(a[i]>*max){
*max=a[i];
}
}
}
3
#include <stdio.h>
int divide(int a,int b,int *result);
int main(){
int a=5;
int b=0;
int c;
if (divide(a,b,&c)){
printf("%d / %d = %d",a,b,c);
}
return 0;
}
int divide(int a,int b,int *result){
int ret =1;
if(b==0) ret =0;
else
*result = a/b;
return ret;
}
任何一个地址变量没有被赋值之前,没有得到任何实际变量的地址之前,不能通过他用*去访问任何变量。
在C语言中,指针是一种特殊类型的变量,其存储的值是内存地址。指针变量在被赋值之前,不应被用于访问任何变量,因为它存储的值是未知的,可能指向任何内存位置。在使用指针之前,需要确保它存储了有效的、已分配的内存地址。
#include <stdio.h>
int main() {
int x = 42;
int *ptr; // 声明一个整型指针,但尚未赋值
// *ptr = x; // 这是错误的,因为 ptr 尚未被赋值
ptr = &x; // 正确:将 ptr 设置为 x 的地址
printf("Value of x: %d\n", *ptr); // 正确:通过 ptr 访问 x 的值
return 0;
}
总之,确保在使用指针之前,它已经被正确地初始化并赋值为有效的内存地址。否则,使用未初始化的指针可能导致未定义的行为和内存访问错误。
???
const在*后说明指针不能被修改,前两个是一样的