c语言指针初始化赋值,c 语言中这个指针赋初值的问题

1,c 语言中这个指针赋初值的问题#include "stdio.h"void main( )int i=10;int *p;p=&i;printf("%d",*p);}应该是这样,将i的地址给p,相当于这样的程序#include "stdio.h"void main( )int i=10;int *p=&i;printf("%d",*p);}指针指向i的内存单元 。而不是将*p单独拿来用,这个相当于指存所指内存单元的值,而不是地址,所以,我们应将i的地址即&i给p.a=p1==&m; 因为逻辑运算符等号 == 的优先级比赋值运算符 = 高,所以这个表达式其实就是 a=(p1==&m); c语言里面非零为真,0为假,因为 p1==&m 表达式为假,所以 a 的值为0 。。c语言里面 , 对于 a/b,如果 a 和 b 都是 int 类型的话,那么 a/b 表示的是整除,所以在这里 -4/6 = 0 。。所以 b 的值为 7 。。int *p;这句话只定义了p,没有初始化,它指向的是一个未知地址.*p=i;中*p是指p指向的值,p指向的是未知地址所以是不合法的对p的赋值应该是p=&i;或者p=malloc(sizeof(int));*p=i;【c语言指针初始化赋值,c 语言中这个指针赋初值的问题】
2,C字符指针数组的初始化及赋值问题哦char* ch[2]={ (new char[10]), (new char[20])};只有在定义的同时这样(a[20]="what for")赋值才行,其他不行,这是c语言规定的要先定义然后再在其他地方赋值的话 , 就只能一个一个元素单独赋值,不过要是想达到同样的效果(类似a[20]="what for"),对于字符串数组,可以用库函数strcpy(...)函数赋值,其他的话,你可以自己写函数给他们赋初值?。har *ptr_arr[N];for (int i=0; i<N; ++i) ptr_arr[i] = new char[M];}//...for (int i=0; i<N; ++i) delete []ptr_arr[i];}刚才不是说了么?不过leewycyp说的也可以的!-----------------char* l;cin>> l; 对一个没有指向的指针进行写入操作,导致了你的错误...char *ptr_arr[N];for (int i=0; i<N; ++i) ptr_arr[i] = new char[M];}//...for (int i=0; i<N; ++i) delete []ptr_arr[i];}
3,c语言指针初始化指针申明的时候最好初始化 。。初始化以后的指针在一些操作下野会变成野指针,比如:free释放内存以后 。。指向被释放的内存的指针也是野指针 。。我理解的野指针就是不可控的 , 不确定指向的指针都是野指针 。注意了,a只是一个双重指针,不是数组 。还有new这个东西是C++中的 。C中用malloc分配内存,再初始化 。第一个,指针变量是局部变量,且没有正确赋值,是一个野指针第二个,指针变量是形参,在函数调用中就吧实参值传给形参了,所以实际上指针p是有被正确赋值的(当然此处假设是调用正确的情况下),不是野指针指针指向变量后才能操作,如:int *pt,a;pt=&a;*pt=5;第二个char *i;i="hello";这样是正确的.int array[4][5][6];int (*pa)[4][5][6] = &array;//一级指针,指针向一个数组,该数组为int [4][5][6]int (**a)[4][5][6] = &pa;//二级指针 , 指向上一行的一级指针 对于动态分配的结构,不可能用数组这种形式来存储的 。因为数组的下标必须在编译时刻明确为常量 。楼主用的C++,可以考虑用STL的vector 。另外,我觉得本身用维度这么大的数组就不是很合适,应该换别的方式 。
4,在C语言中关于字符型指针初始化char phello world 的问题搜对于字符串常量,编译器都是默认按其大小分配内存存放字符串 , 并把地址首地址赋值指针变量 。如:char *p="hello world";其实编译的时候等于:const char str[] = "hello world";char *p = str;只不过这个 str 数组名你没法直接拿来用而已 。char *p="hello world" 这是一个特例,编译器还是这样处理的: const char*p="hello world"字符串的返回值是个char*, 也就是说是个地址 。比如 "hello"这个字符串,他的返回值是它的首字母h在内存中的地址 。"hello world"作为静态字符串实际上存储在数据区,但写程序的人不知道这个地址 , 而程序本身知道 。当某一函数以方式使用此静态字符串时,实际上相当于:char p[12];strcpy(p, "hello world");....p[12]是在栈里临时分配的 。虽然p指向的内容是"hello world", 但是这是复制品 , 不是原件 。当函数结束,char p[]就被程序回收了,所以p[]的内容就不再是"hello world"了 。但如果以char *p="hello world"的方式使用,p指向的是静态字符串存储的位置,也就是说指向"hello world"的原件 , 当然没有问题了 。如果想坚持用char p[]而不使用char *p, 有效方法必须是:static char p[]="hello world";return p;}static char []是静态的,存储在数据区 。5 , C语言程序设计 指针变量赋值要将指针指向的值赋值到变量上,需要将指针指向的值取出 , 然后执行赋值操作 。对指针取值需要使用取值运算符*,这个符号和乘相同 , 但功能不同 。用于取值时,*为单目运算,与后续的指针相结合,实现取指针指向的值的效果 。比如int a = 10;int b;int *p = &a;这时p指向变量a的地址,指向的值为10,要将其赋值给b,需要b = *p;C语言 形式逻辑不成立(C语言的缺点?。?。inta[ 10] ,*p=a; 是声明,声明中 *p=a 表示p是指针,初始化把a数组的首地址赋给它 。*p=a;是语句,不是声明,形式一样,就不行了!因为 语句 里,*p 表示p 指向的 值 。同样的形式 , 意思不同,形式逻辑不成立,(C语言的缺点?。?。初学者,人人遇到这个问题!对的,你声明一个数组时数组名就是首地址,执行i=a这条赋值语句时,指针变量i中的内容就是数组a的首地址,j=i,i做左值它代表指针变量i中的内容也就是数组的首地址,执行完这个语句后指针变量j的内容也是数组a的首地址 。这是你可以通过间接访问符*去访问所储存地址中的内容 。int *p;中的“*”说明定义的一个变量p是指针类型的 。而*p中的“*”是一种操作,是取值操作 。即去指针指向的那个值 。*p可看作是一个整形的变量 。a则可以看成是一个指针 。* 称为指针运算符主要有如下两种用法:* 出现在数据定义语句中时,*在数据类型与变量之间 , 是一个二元运算符,用来定义指针变量 。例如:int * ip;inta[ 10] ,*p=a;表示的也是定义一个指针变量 p同时把a的首地址给p* 出现在指针变量表达式左边时,是一个一元运算符,表示访问指针所指对象的内容 。例如: inta =10; * p=a ; printf("%d",*p)表示输出 a 的值10int *p; 代表定义指针变量*p在语句中使用代表取值 但是如果是这样int *p,a[10];*p=a;就不行了 正确的应该是 p = a;

    推荐阅读