Answers
下面是我之前学习做的笔记,你凑合看一下
int (*func_p)();//指向int类型函数的指针
int *f();//返回指向int类型指针的函数
int num = 1;
int *p_num;
p_num = # //
*p_num//是取出num的数据
p_num//是取出num的内存地址
&P_num//是取出p_num的内存地址
p_num+1//是对num的内存地址加1 ,因为num是int类型的,占用4个字节,如果原来是0x000004那么加1后就是0x000008(数据只是测试随便写的),而不是对num的值计算
int arr[] = {1,2,3,4};
printf("%d\n", (arr+1));// 数组可以是分配好的连续指针,arr就是这个数组的首地址,对地址+1就是对这个类型+1,如果arr[0]是0x00004那么arr[1]就是0x00008然后前面的 就是取地址值。 如果是int arr[][4]也可以写成int *arr[4];
printf("%d\n",*arr+1);//同上
(K&R 423页)
int arr[8][8];//int的数组
int **p;//指向int类型指针的指针
int *p[10];//具有10个元素的数组, 每个元素是一个指向int的指针
int (* p)[10];//一个指针, 指向有10个元素的int类型的数组
int * p[3][4];
int (* p) [3][4];
int (* p[3]) [4]; //具有3个元素的数组, 每个都是指向具有4个元素的int数组的指针
char *pd () //返回指向char的指针的函数
char (* pd)()//指向返回类型为char的函数的指针
char (* pd[3])()//由3个指针组成的数组,每个指针指向返回类型为char的函数
int const | const int p =&1 // p不能在修改了, p还可以使用
int const p = 1; //p不能在修改了, p还可以
const 在谁前面,修饰谁
第一个是声明一个常量的指针变量。指向的对象不可以修改但是P的指向可以修改。
第二个是声明一个指针变量P是常量类型,指向不可以修改但是指向的对象可以修改。
这只能说明对指针概念还不是很清楚。指针就是保存内存空间的地址的变量。例如定义指针 int pr=100; 那么变量pr的值保存的就是整数100所在空间的地址,假如为5000,则pr=5000; 而 pr表示对pr指向的内存空间中保存的数据的读写,也就是100。所以要读取100这个数据,就要用 pr,例如:printf("%d", pr);
int main(int argc,char *arg[]){
//保存整数的指针,并分配空间
int *pr = (int *)malloc(100*sizeof(int));
*pr = 100;
printf("pr指向空间的地址为%p,pr指向空间的内容是%d\n\n",pr,*pr);
free(pr); //用完指针记得释放
//保存字符串的指针,并分配空间
char *str = (char *)malloc(100*sizeof(char));
str = "You are so beautiful!";
while( *str != '\0' ){
printf("当前str指向的空间地址:%p,当前str指向空间里保存的数据是%c\n",str,*str++);
}
str = NULL;
free(str);
return 0;
}
对于题主
我感觉指针是一直要用 *才能输出里面的内容的
这个说法,其实是不恰当的。
指针和其它所有的变量一样,都是一种变量类型,都有
标识符
和
值
两个属性。所有的值都是数字(因为计算机只能存
01
,
01
可以很直接转换为十进制数)。这个值如果直接读,是完全混乱的。比如,
10
是什么?我即可以说是
数字10
,也可以是
ascii码为10
的那个
字符
,还可以是
指针
(其指向地址为10的那个变量)。所以,
值
与
标识符
与
变量类型
绑定,三者共同解释一个变量。说这么多,就一句:
变量都是统一的
。
对于指针,也是一个这样通用的变量。题中的
p
与
*p
与,
*a
与
a
其实没有本质区别。
printf("%s\r\n",p)
。
%s
表示输出从第二个参数
(即p)
指向(p甚至不是指针都可以,C语言只是愚蠢地去得到p的值,然后找到地址为这个值的字符,这个就表示p指向的字符)的那个字符开始,一直到
\0
结束 的字符串。
如果你写成
printf("%s\r\n",*p)
,就表示
*p
指向的地址(注意,不是
p
指向的地址)而
*p
的值是一个字符类型,对它的值代表的地址访问是非法不合理的,但c是自由的,应该会允许这样做。
printf("\r\n%d",*a)
%d
是以十进制输出第二个参数(变量)的值,
*a
代表以
a
的值为地址的那个变量
。所以,就是输出
a
指向的那个变量的值,而如果是
printf("\r\n%d",a)
,它输出的就是
a
的值,也就是是
num`变量的地址。
说的比较乱,但都是自己的一些总结。题主不妨多理解下。