指针与地址

1.

#include<stdio.h>

int main(int argc, const char *argv[])
{

char* cnames[]={"aaaaa","bbbbb"};

这是一个指针数组,里面所有的元素都是指针,但这里的指针是一个地址常量,比如“aaaaa”本身就是一个地址

直接使用%p,就可以打印出这一固定的地址值。

printf("%p %p\n","aaaaa","bbbbb");

printf("%p %p\n",cnames[0],cnames[1]);

或者,因为数组里面的变量就是指针,所以直接打印数组里的元素,就是打印出地址值。

int a[3]={};
       printf("%p",a);在这里,a本身就是一个地址,不用再加&,可以得出数组a的首地址
       printf("%p\n",&a[0]);
return 0;

}

2.不只是数组的变量名称代表地址,函数的变量名称也代表该函数的首地址,也就是函数的入口

#include<stdio.h>
int sum(int i,int j)
{
return i+j;
}
int main(int argc, const char *argv[])
{
int(*p)(int i,int j);
int a=10;
int b=10;
sum(a,b);

        p=sum;

在进行打印时,可以直接打印函数的名称

第二种方式,类似于:int *p;

                               int a=32;

                               p=&a;

printf("%p",p);打印出来就是a的地址,如果是printf("%p",&p);打印出的就是指针变量p的地址。

这里的p=sum,相当于p=&a。即先定义一个指针变量,再让这个指针变量指向一个地址。

printf("%p",sum);
printf("%p",p);
return 0;

}

3.除非在定义的时候出现*是代表,现在在定义一个指针变量,如果不是在定义的时候出现*,都是代表取地址里面的值。

一般定义完*p=&a;

在底下的程序里出现p,就把他看成是一个地址,*p看成是在取值。

4.字符串是一种特殊的字符数组,字符数组的复制可以是:

char a[]={'a','b''c'};

char a[]="abc";当使用字符串给字符数组赋值的时候,系统以单个字符的形式存储起来,并且自动加入‘/0’,跟一般的字符数组做以区分。

char* p;

p=a;*(p+4)=?

既然是以单个字符的形式存储起来,且指针以一个字节为单位移动,所以当指针移动四个单位时,指针指到\0的位置。

char* a[]={"hello","world","shijie"};
printf("%p",a);

printf("%p\n",&a[0]);

a作为字符数组的首地址,可以直接用%p打印出来

也可以获得a[0]的地址,打印出来

printf("%p",a[0]);

printf("%p\n","hello");

a[0]本身作为一个地址常量,可以打印出来

而这个“hello"作为这个地址常量,也可以直接打印出,且两者值相等。

char a[]={'h','e','l','l','l','o'};

printf("%p",a);
printf("%s",a);
在打印字符串的时候

char a[]="hello";

printf("%s",a);

a作为字符串的首地址,直接打印出来的是字符串。

而a作为字符串的首地址,可以直接以%p的形式打印出来该字符数组的首地址。



猜你喜欢

转载自blog.csdn.net/chengchaonan/article/details/79539606
今日推荐